web-dev-qa-db-ja.com

Javaで実際にゼロで除算せずにゼロ除算例外をスローするにはどうすればよいですか?

分母と分子の2つの入力を必要とするI2Cデバイスがあります。両方とも別々のアドレスに書き込まれるため、実際の計算はありません(numerator/denominator) 終わらせる。これに伴う問題は、I2Cデバイスでゼロ除算が発生する可能性があるため、ゼロ除算エラーをチェックする必要があることです。理想的には、Javaコードによって分割が行われた場合、まったく同じことが起こります。

現時点では、除算を行う未使用の変数を束ねていますが、最適化されるのではないかと心配しています。

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

きっともっと良い方法があります!

23
Eric

ArithmeticExceptionをスローする必要がありますnot。指定された引数にエラーがあるため、IllegalArgumentExceptionをスローします。 ドキュメント のように:

メソッドに不正または不適切な引数が渡されたことを示すためにスローされます。

これがまさにここで起こっていることです。

if (divisor == 0) {
    throw new IllegalArgumentException("Argument 'divisor' is 0");
}
52
Joren

これを行う:

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

ArithmeticExceptionは、通常、0で割ったときにスローされる例外です。

16
uckelman
public class ZeroDivisionException extends ArithmeticException {
    // ...
}

if (denominator == 0) {
    throw new ZeroDivisionException();
}
8
João Silva

これを行うには2つの方法があります。ゼロ除算エラーを表す独自のカスタム例外クラスを作成するか、この状況で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
slangevi

何かのようなもの:

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