斯卡拉:除以零

goo*_*goo 5 scala divide-by-zero

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

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

    (x / y)
}
Run Code Online (Sandbox Code Playgroud)

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

我知道我能做到:

Try(someVale) orElse Try(0)
Run Code Online (Sandbox Code Playgroud)

但是,这会给我,Success(0)而我只是想0在这种情况下给我一个.

也许if ArithmeticException then 0在Scala中有类似的东西可以删除"成功"和括号.有人可以解决一些问题吗?

sen*_*nia 12

我假设"除以零"只是一个例子,你无法避免抛出异常.当你可以避免抛出异常时,你应该像在这个答案中那样做.

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

def something(x: Int, y: Int) = Try(x/y).getOrElse(0)
Run Code Online (Sandbox Code Playgroud)

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

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

使用方法get,如果TryFailure,您将获得异常,但recover允许您转换FailureSuccess.

您也可以将您TryOption返回"无结果"没有表现出异常:

def something(x: Int, y: Int): Option[Int] = Try(x/y).toOption
Run Code Online (Sandbox Code Playgroud)


小智 12

我想我会期待:

def something(x: Int, y:Int) = if ( y != 0) x/y else 0
Run Code Online (Sandbox Code Playgroud)

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