如何处理除以0

时间:2011-05-06 07:40:52

标签: java android try-catch

if (getOperator=="/"){
    try {
        sum = value1/value2;
    } catch (Exception e) {
        summaryTxt.setText("Invalid operation");
    }
}

这里有什么问题?

7 个答案:

答案 0 :(得分:6)

这是错误的,这是一种不好的做法。

想象一下,value1可以是Integer,它是null。然后你将捕获一个NullPointerException,但是你的代码会告诉你操作是无效的,但事实并非如此。

例外情况不适用于检查条件。最好明确地检查它们:

     if (getOperator=="/"){
        if (value2 == 0) {
           summaryTxt.setText("Value2 can't be 0!");
        } else {
           sum = value1/value2;
        }
      }

答案 1 :(得分:3)

如果值为例如,除以零将抛出ArithmeticException。整数,这就是你应该抓住的东西。

使用双精度执行除零将改为给出Double.Infinity

的结果

答案 2 :(得分:3)

我使用以下内容来处理除 NaN 的划分:

public static double safeDivide(double dividend, double divisor) {
    if(Double.compare(divisor, Double.NaN) == 0) return Double.NaN;
    if(Double.compare(dividend, Double.NaN) == 0) return Double.NaN;
    if(Double.compare(divisor, 0.0) == 0) {
        if(Double.compare(dividend, 0.0) == -1) {
            return Double.NEGATIVE_INFINITY;
        }
        return Double.POSITIVE_INFINITY;
    }
    if(Double.compare(divisor, -0.0) == 0) {
        if(Double.compare(dividend, -0.0) == 1) {
            return Double.NEGATIVE_INFINITY;
        }
        return Double.POSITIVE_INFINITY;
    }
    return dividend / divisor;
}
  

<强>参考:

     

math.stackexchange &gt;&gt; I have learned that 1/0 is infinity, why isn't it minus infinity?

答案 3 :(得分:1)

你可以简单地检查一下 Value2.equals(0); 并且如果是这样抛出你自己的异常

答案 4 :(得分:1)

如果你想通过捕获异常来做到这一点:

if (getOperator == "/") {
    try {
        sum = value1 / value2;
    } catch (ArithmeticException e) {
        summaryTxt.setText("Invalid operation: " + e.getMessage());
    }
}

捕获Exception一般来说绝对是一个坏主意,如果不是在这个特定情况下。问题是你很有可能会遇到你(程序员)没有预料到的其他异常;例如如果value1value2的类型是原始包装类且值为null,则在此情况下为NullPointerException。

您是否应该使用异常或通过显式测试零来实现它也是有争议的。 IMO,无论哪种方式都可以接受。对于此代码,除以零很可能是罕见的,并且规则是您应该仅在特殊情况下使用异常。 (你不必,但你可以......)

但是,我认为我会使用一个明确的测试,理由是它使代码更容易阅读。

if (getOperator == "/") {
    if (value2 != 0) {
        sum = value1 / value2;
    } else {
        summaryTxt.setText("Invalid operation: divide by zero");
    }
}

(旁白:getOperator == "/"狡猾,除非你的代码保证 getOperator总是包含一个实习字符串......)

答案 5 :(得分:0)

if (getOperator=="/" && value2 == 0){
    summaryTxt.setText("Value2 can't be 0!");
}else if(getOperator=="/" && != 0){
    sum = value1/value2;
}

如此美丽的代码)

答案 6 :(得分:0)

编写这样的扩展功能

    Double.safeDiv(other:Number,fallback:Double):Double {
       if(other == 0)
          return fallback
       else 
          return this / other
   }

其中fallback是当分频器为0时要返回的值