在Java中,如何在不实际被零除的情况下抛出被零除异常?

在Java中,如何在不实际被零除的情况下抛出被零除异常?,java,exception,math,divide-by-zero,Java,Exception,Math,Divide By Zero,我有一个I2C设备,需要两个输入:分母和分子。两者都写入不同的地址,因此不进行实际计算(分子/分母)。问题是I2C设备上可能会出现零除,因此需要检查零除错误。理想情况下,如果由java代码进行除法,也会发生完全相同的情况 目前,我预感到一个未使用的变量会进行除法,但我担心它会得到优化: public void setKp(int numerator, int divisor) { int zeroCheck = numerator / divisor; //... doesn't

我有一个I2C设备,需要两个输入:分母和分子。两者都写入不同的地址,因此不进行实际计算(
分子/分母
)。问题是I2C设备上可能会出现零除,因此需要检查零除错误。理想情况下,如果由java代码进行除法,也会发生完全相同的情况

目前,我预感到一个未使用的变量会进行除法,但我担心它会得到优化:

public void setKp(int numerator, int divisor)
{
    int zeroCheck = numerator / divisor;
    //... doesn't use zeroCheck
}
当然还有更好的办法

这样做:

if (denominator == 0) throw new ArithmeticException("denominator == 0");
算术异常是通常在除以0时引发的异常。

类似于:

if(divisor == 0) {
  throw new ArithmeticException("Division by zero!");
}
您不应该抛出算术异常。由于错误在提供的参数中,因此抛出一个
IllegalArgumentException
。正如政府所说:

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

这正是这里发生的事情

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

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

定义自定义异常 然后在代码中检查除法是否为零,并引发以下异常:

if (divisor == 0) throw new DivideByZeroException();
if (divisor == 0) throw new java.lang.ArithmeticException("/ by zero");
抛出算术异常 在代码中添加检查除以零并引发算术异常:

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

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


建议直接检查除数的答案似乎更好,但我无法想象这会得到优化。当然,zeroCheck可能不会被分配,但是除法有可能抛出异常,因此我无法想象它实际上会被优化掉。OP指定:“理想情况下,如果由java代码进行除法,同样的事情也会发生。”我同意。我的回答是,如果你真的被零除了,那么如何得到与你相同的行为,而不是你是否应该。伊莎,是的,但我觉得对这个断言进行二次猜测是合适的。关于这个观点存在一些争论。例如,一些人认为(正如你所认为的,我假设)给不接受null的方法的null参数应该导致抛出IllegalArgumentException,而其他人认为在这种情况下应该抛出NullPointerException。我认为NullPointerException永远不应该手动抛出,而是在将null错误地传递给方法时抛出IllegalArgumentException。如果这样做了,并且您从一个方法中得到了一个NullPointerException,那么您可以确定该代码中有一个bug。如果该方法抛出IllegalArgumentException,则您知道代码中存在错误。我认为这是一个非常有用的区别。也就是说,我通常用C#编程,在.NET上,NullReferenceException和ArgumentNullException之间的区别非常明显。在Java中,我不确定预期的设计是否与重复答案相同。似乎你必须快速回答问题!:)为什么人们会扩展算术异常而不是异常?当一个类只需要来自异常的消息实例变量时,扩展一个占用更多空间的类不是“浪费”了吗?它是否还提供了有关EXCEPTION(算术)类型的对象数据以获取更多信息,这就是它扩展算术异常的原因?
if (divisor == 0) throw new java.lang.IllegalArgumentException("divisor == 0");