Как я должен бросить деление на ноль исключения в Java без фактического деления на ноль? - PullRequest
22 голосов
/ 01 ноября 2009

У меня есть устройство I2C, которое хочет два входа: знаменатель и числитель. Оба написаны по разным адресам, поэтому фактический расчет (numerator/denominator) не производится. Проблема заключается в том, что на устройстве I2C может произойти деление на ноль, поэтому необходимо проверить ошибку деления на ноль. В идеале, то же самое могло бы произойти, если бы деление выполнялось с помощью кода Java.

В данный момент я получил неиспользованную переменную, которая выполняет деление, но я боюсь, что она будет оптимизирована:

public void setKp(int numerator, int divisor)
{
    int zeroCheck = numerator / divisor;
    //... doesn't use zeroCheck
}

Конечно, есть лучший способ!

Ответы [ 5 ]

50 голосов
/ 01 ноября 2009

Вы должны , а не , генерировать исключение ArithmeticException. Поскольку ошибка указана в предоставленных аргументах, выведите IllegalArgumentException. Как говорится в документации :

Брошенный, чтобы указать, что методу был передан недопустимый или неподходящий аргумент.

Что именно здесь и происходит.

if (divisor == 0) {
    throw new IllegalArgumentException("Argument 'divisor' is 0");
}
16 голосов
/ 01 ноября 2009

Сделайте это:

if (denominator == 0) throw new ArithmeticException("denominator == 0");

ArithmeticException - это исключение, которое обычно выдается при делении на 0.

8 голосов
/ 01 ноября 2009

Есть два способа сделать это. Либо создайте свой собственный класс исключений, чтобы представить ошибку деления на ноль, либо сгенерируйте исключение того же типа, которое среда выполнения Java выдает в этой ситуации.

Определить пользовательское исключение

public class DivideByZeroException() extends ArithmeticException {
}

Тогда в вашем коде вы проверите деление на ноль и сгенерируете это исключение:

if (divisor == 0) throw new DivideByZeroException();

Бросок ArithmeticException

Добавьте в свой код проверку деления на ноль и сгенерируйте арифметическое исключение:

if (divisor == 0) throw new java.lang.ArithmeticException("/ by zero");

Кроме того, вы можете подумать о выдаче недопустимого аргумента исключения, поскольку делитель нуля является неверным аргументом для передачи в ваш метод setKp ():

if (divisor == 0) throw new java.lang.IllegalArgumentException("divisor == 0");
8 голосов
/ 01 ноября 2009
public class ZeroDivisionException extends ArithmeticException {
    // ...
}

if (denominator == 0) {
    throw new ZeroDivisionException();
}
3 голосов
/ 01 ноября 2009

Что-то вроде:

if(divisor == 0) {
  throw new ArithmeticException("Division by zero!");
}
...