Scala:除以零

6

我在我的应用程序中有类似这样的内容:

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的东西可以去掉“Success”和括号。能否有人解释一下?


以防万一:这只是不可避免异常的一个例子,还是问题确实在于“除以零”? - senia
3个回答

15

我想我会寻找:

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

2
+1 - 这是唯一合理的答案。用大量额外机制和巨大的运行时成本来捕获算术异常,而不是执行单个简单条件语句,这是疯狂的! - Rex Kerr
2
这取决于 y==0 发生的频率;如果 y == 0 很少发生,则通常 try-catch 是免费的,而如果 (y != 0) 在所有情况下都具有恒定的成本。 - Ron Reynolds

12

我假设“除以零”只是一个例子,你不能避免抛出异常。当你可以避免抛出异常时,应该像这个答案中所述那样去做。

你可以使用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

4

捕获异常并返回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

2
由于ae未被使用,所以可以改为case _: Arithm...。同时,建议去掉外部大括号和括号。 - som-snytt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接