如何在Java中抛出除以零的exception而不实际除以零?

我有一个需要两个输入的I2C设备:分母和分子。 两者都写入单独的地址,因此不进行实际计算( numerator/denominator )。 这样做的问题是在I2C器件上可能会出现除零,因此需要检查除零误差。 理想情况下,如果划分由java代码完成,则会发生完全相同的事情。

目前,我已经提供了一个未使用的变量进行划分,但我担心它会被优化出来:

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

当然有更好的方法!

你不应该抛出ArithmeticException。 由于错误在提供的参数中,因此抛出IllegalArgumentException 。 正如文件所说:

抛出以指示方法已被传递非法或不适当的参数。

这正是这里发生的事情。

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

做这个:

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

ArithmeticException是除以0时通常抛出的exception。

 public class ZeroDivisionException extends ArithmeticException { // ... } if (denominator == 0) { throw new ZeroDivisionException(); } 

有两种方法可以做到这一点。 要么创建自己的自定义exception类来表示除零错误,要么抛出java运行时在这种情况下抛出的相同类型的exception。

定义自定义exception

 public class DivideByZeroException() extends ArithmeticException { } 

然后在您的代码中,您将检查除以零并抛出此exception:

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

抛出ArithmeticException

添加到代码中检查除以零并抛出算术exception:

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

另外,你可以考虑抛出一个非法的参数exception,因为除数为零是一个不正确的参数传递给你的setKp()方法:

 if (divisor == 0) throw new java.lang.IllegalArgumentException("divisor == 0"); 

就像是:

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