如何在Java中抛出除零异常而不实际除以零?

Eri*_*ric 24 java math exception divide-by-zero

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

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

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

当然有更好的方法!

Jor*_*ren 52

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

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

这正是这里发生的事情.

if (divisor == 0) {
    throw new IllegalArgumentException("Argument 'divisor' is 0");
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为永远不应该手动抛出NullPointerException,而是在将null错误地传递给方法时抛出IllegalArgumentException.如果已完成,并且您从方法中获得NullPointerException,则可以确定该代码中存在错误.如果该方法抛出IllegalArgumentException,您知道*your*code中存在错误.我认为这是一个非常有用的区别.也就是说,我通常在C#中编程,并且在.NET上NullReferenceException和ArgumentNullException之间的区别非常明显.在Java中,我不太确定预期的设计是否相同 (5认同)

uck*_*man 16

做这个:

if (denominator == 0) throw new ArithmeticException("denominator == 0");
Run Code Online (Sandbox Code Playgroud)

ArithmeticException是除以0时通常抛出的异常.


Joã*_*lva 8

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

if (denominator == 0) {
    throw new ZeroDivisionException();
}
Run Code Online (Sandbox Code Playgroud)

  • 人们如何扩展ArithmeticException而不是Exception?当所有需要的只是Exceptions的Message实例变量时,扩展整个类占用更多空间的类不是'wastefull'吗?它是否也借出有关专有类型(算术)的对象数据以获取更多信息,这就是为什么它扩展了ArithmeticException? (2认同)

小智 8

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

定义自定义异常

public class DivideByZeroException() extends ArithmeticException {
}
Run Code Online (Sandbox Code Playgroud)

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

if (divisor == 0) throw new DivideByZeroException();
Run Code Online (Sandbox Code Playgroud)

抛出ArithmeticException

在代码中添加除以零的检查并抛出算术异常:

if (divisor == 0) throw new java.lang.ArithmeticException("/ by zero");
Run Code Online (Sandbox Code Playgroud)

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

if (divisor == 0) throw new java.lang.IllegalArgumentException("divisor == 0");
Run Code Online (Sandbox Code Playgroud)