29

我有一个需要两个输入的 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

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

定义自定义异常

public class DivideByZeroException() extends ArithmeticException {
}

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

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

抛出算术异常

在您的代码中添加除以零的检查并引发算术异常:

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 回答