【问题标题】:How should I throw a divide by zero exception in Java without actually dividing by zero?我应该如何在Java中抛出除以零异常而不实际除以零?
【发布时间】:2009-11-01 18:27:34
【问题描述】:

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

目前,我已经确定了一个未使用的变量来进行除法,但我担心它会被优化:

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

肯定有更好的方法!

【问题讨论】:

  • 建议直接检查除数的答案似乎更好,但我无法想象这会被优化掉。当然 zeroCheck 可能不会被分配,但该部门有可能引发异常,所以我无法想象它实际上被优化掉了。

标签: java exception math divide-by-zero


【解决方案1】:

您应该抛出 ArithmeticException。由于错误出现在提供的参数中,因此抛出IllegalArgumentException。正如documentation 所说:

抛出表明一个方法被传递了一个非法或不适当的参数。

这正是这里发生的事情。

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

【讨论】:

  • OP 指定:“理想情况下,如果由 java 代码完成分割,会发生完全相同的事情。”
  • 我同意。我的回答只是解决如何获得与实际除以零时相同的行为,而不是是否应该这样做。
  • 义卖,是的,但觉得对这种说法进行二次猜测是合适的。
  • 关于这个观点存在一些争论。例如,有些人认为(如你所想,我假设)为不接受 null 的方法提供 null 参数会导致抛出 IllegalArgumentException,而另一些人则认为在这种情况下应该抛出 NullPointerException。跨度>
  • 我认为 NullPointerException 永远不应该手动抛出,而是在 null 错误地传递给方法时抛出 IllegalArgumentException。如果这样做了,并且您从方法中得到 NullPointerException,那么您确定该代码中存在错误。如果该方法抛出 IllegalArgumentException,您就知道 您的 代码中存在错误。我认为这是一个非常有用的区别。也就是说,我通常使用 C# 进行编程,并且 NullReferenceException 和 ArgumentNullException 之间的区别在 .NET 上非常清楚。在 Java 中,我不太确定预期的设计是否相同
【解决方案2】:

这样做:

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

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

【讨论】:

    【解决方案3】:
    public class ZeroDivisionException extends ArithmeticException {
        // ...
    }
    
    if (denominator == 0) {
        throw new ZeroDivisionException();
    }
    

    【讨论】:

    • 人们怎么会扩展 ArithmeticException 而不是 Exceptions?当它只需要来自异常的 Message 实例变量时,扩展一个占用更多空间的类难道不是“浪费”吗?它是否还借出有关异常类型(算术)的对象数据以获取更多信息,这就是它扩展 ArithmeticException 的原因?
    【解决方案4】:

    有两种方法可以做到这一点。要么创建您自己的自定义异常类来表示除以零错误,要么抛出 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");
    

    【讨论】:

    • 抱歉重复的答案。看来你必须快速回答问题! :)
    【解决方案5】:

    类似:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      相关资源
      最近更新 更多