29

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

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

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

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

4

5 に答える 5

55

ArithmeticExceptionをスローしないでください。エラーは指定された引数にあるため、。をスローしIllegalArgumentExceptionます。ドキュメントにあるように:

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

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

if (divisor == 0) {
    throw new IllegalArgumentException("Argument 'divisor' is 0");
}
于 2009-11-01T18:38:44.680 に答える
19

これを行う:

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

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

于 2009-11-01T18:28:55.090 に答える
8
public class ZeroDivisionException extends ArithmeticException {
    // ...
}

if (denominator == 0) {
    throw new ZeroDivisionException();
}
于 2009-11-01T18:33:13.130 に答える
8

これを行うには 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");
于 2009-11-01T18:56:27.873 に答える
3

何かのようなもの:

if(divisor == 0) {
  throw new ArithmeticException("Division by zero!");
}
于 2009-11-01T18:31:35.570 に答える