【问题标题】:How to handle divide by 0如何处理除以0
【发布时间】:2011-05-06 07:40:51
【问题描述】:
if (getOperator=="/"){
    try {
        sum = value1/value2;
    } catch (Exception e) {
        summaryTxt.setText("Invalid operation");
    }
}

这里有什么问题?

【问题讨论】:

  • 这与您的问题没有直接关系,但您永远不应该将字符串与 == 进行比较。请改用等于。 == 用于比较内存引用。另外,要么您使用吸气剂名称 getOperator 而您的缺失 (),要么您应该使用更好的名称(如运算符)。

标签: java android try-catch


【解决方案1】:

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

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

异常不适用于检查条件。最好明确地检查它们:

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

【讨论】:

  • +1: 异常不应该用于流控制,特别是当简单的if-else 检查就足够了。 @user655443:如果它不显示该消息,则 value2 不为零。因此不会出现被零除的错误。
  • 我试试 if (getOperator=="/"){ { if (value2 == 0) { Log.d("test", "eeee"); summaryTxt.setText(""+"Value2不能为0!"); } else { sum = value1/value2; } } }
  • 当 value2=0 时在 Logcat 中显示“eeee”,但不显示“Value2 不能为 0!”
  • 那就是不相关的问题。再问一个问题,展示更多代码:你如何定义summaryTxt,这段代码在哪里执行等等。
  • 附带说明,缓存异常应该比每次要划分时使用 if 更快。但仅仅通过阅读代码和上下文,影响可以忽略不计。这只是为了包含一个理由,其中一个人更愿意捕捉算术错误。
【解决方案2】:

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

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 始终包含一个实习字符串 ...)

【讨论】:

    【解决方案3】:

    我使用以下方法来处理除以 ZeroNaN

    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;
    }
    

    参考:

    ma​​th.stackexchange >> I have learned that 1/0 is infinity, why isn't it minus infinity?

    【讨论】:

      【解决方案4】:

      如果值为例如,除以零将引发 ArithmeticException整数,所以这就是你应该抓住的。

      使用双精度数除以零将得到一个结果,即 Double.Infinity

      【讨论】:

        【解决方案5】:

        您可以简单地检查是否 值2.等于(0); 如果是的话,抛出你自己的异常

        【讨论】:

          【解决方案6】:
          if (getOperator=="/" && value2 == 0){
              summaryTxt.setText("Value2 can't be 0!");
          }else if(getOperator=="/" && != 0){
              sum = value1/value2;
          }
          

          这么漂亮的代码)

          【讨论】:

            【解决方案7】:

            像这样写一个扩展函数

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

            其中fallback是当divider为0时你想要返回的值

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-09-28
              • 2021-02-24
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多