2014-01-14 53 views
3

我在我的应用程序是这样的鸿沟:现在斯卡拉:由零

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)而我只是喜欢它给我一个0123在这种情况下为。

也许在Scala中有类似if ArithmeticException then 0的东西或删除“成功”和括号。有人可以请一些光吗?

+0

以防万一:它只是不可避免的异常或问题的一个例子是字面上的“鸿沟通过零“? – senia

回答

10

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

你可以对Try代替orElse使用getOrElse方法:

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你如果Try的值为Failure,会得到一个例外,但recover可以让您将Failure转换为Success

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

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 
+1

由于'ae'没有被使用,所以'case _:Arithm ...'我也会失去外部支撑和支撑... –

9

我想我会期待:

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

+1 - 这是唯一合理的答案。用大量额外的机器和巨大的运行时间成本来捕捉算术异常,而不是执行一个简单的条件就是疯狂! –