【问题标题】:Scala: Divide by zeroScala:除以零
【发布时间】:2014-01-14 22:42:33
【问题描述】:

我的应用中有这样的东西:

def something(x: Int, y: Int) Z {

    (x / y)
}

现在,如果 someval 不是数字(意味着 x 或 y 等于 0),那么我希望 Z 变为 0 而不是显示错误 ([ArithmeticException: Division by zero])

我知道我能做到:

Try(someVale) orElse Try(0)

但是,这会给我Success(0),而在这种情况下,我希望它给我一个0

也许 Scala 中有类似 if ArithmeticException then 0 的东西,或者删除“成功”和括号的东西。有人能解释一下吗?

【问题讨论】:

  • 以防万一:这只是一个不可避免的例外的例子,还是问题实际上是“除以零”?

标签: scala divide-by-zero


【解决方案1】:

我想我会考虑:

def something(x: Int, y:Int) = if ( y != 0) x/y else 0

【讨论】:

  • +1 - 这是唯一合理的答案。用大量额外的机器和巨大的运行时间成本捕获算术异常而不是执行单个简单的条件是疯狂的!
  • 这取决于 y==0 的频率;如果 y == 0 很少见,那么通常 try-catch 是免费的,而 if(y != 0) 在所有情况下都具有恒定成本。
【解决方案2】:

我假设“除以零”只是一个示例,您无法避免抛出异常。当您可以避免抛出异常时,您应该像 this answer 那样做。

您可以在Try 上使用getOrElse 方法而不是orElse

def something(x: Int, y: Int) = Try(x/y).getOrElse(0)

如果您只想在ArithmeticException 上恢复,您可以使用recover 方法和get

def something(x: Int, y: Int) =
  Try(x/y).recover{ case _: ArithmeticException => 0 }.get

使用方法get,如果TryFailure,您将得到一个异常,但recover 允许您将Failure 转换为Success

您还可以将Try 转换为Option 以返回“无结果”而不显示异常:

def something(x: Int, y: Int): Option[Int] = Try(x/y).toOption

【讨论】:

    【解决方案3】:

    捕获异常并返回 0 是最简单的方法。

    def something(x: Int, y: Int) = try {
        (x / y)
      } catch {
        case ae: java.lang.ArithmeticException => 0
      }
    

    运行它:

    scala> something(1,0)
    res0: Int = 0
    
    scala> something(2,1)
    res1: Int = 2
    

    【讨论】:

    • 由于 ae 未使用,case _: Arithm... 我也会丢失外括号和括号...
    猜你喜欢
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2010-09-14
    • 1970-01-01
    相关资源
    最近更新 更多