2014-01-14 5 views
3

У меня есть что-то подобное в мое приложение:Scala: Деление на ноль

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

    (x/y) 
} 

Теперь, если someval не является числом (это означает, что либо х или у равен 0), то я бы как Z, чтобы просто стать 0 вместо отображения ошибки ([ArithmeticException: Division by zero])

Я знаю, что я могу сделать:

Try(someVale) orElse Try(0) 

Однако, это даст мне Success(0) тогда я бы так же, как для того, чтобы дать мне a 0 в этом случае.

Возможно, есть что-то вроде if ArithmeticException then 0 в Скале или что-то, чтобы удалить «Успех» и круглые скобки. Может кто-то пролить свет, пожалуйста?

+0

На всякий случай: это просто пример неизбежного исключения или проблемы буквально в «разделяй нолем "? – senia

ответ

10

Я предполагаю, что «деление на ноль» является лишь примером, и вы не можете избежать исключения. Когда вы можете избежать исключения, вы должны сделать это, как в this answer.

Вы можете использовать getOrElse метод на Try вместо 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 вы Получается исключение, если Try - Failure, но 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 
+1

Поскольку 'ae' не используется,' case _: Arithm ... 'Я бы также потерял внешние фигурные скобки и parens ... –

9

Я думаю, что я бы смотреть:

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

+1 - Это единственный разумный ответ. Захват арифметического исключения из-за большого количества дополнительных машин и огромной стоимости во время выполнения, а не для выполнения одного простого условного - это безумие! –

Смежные вопросы