如何在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!"); }