Java 如何处理除以0

Java 如何处理除以0,java,android,try-catch,Java,Android,Try Catch,这里怎么了?你可以简单地检查一下 值2。等于(0); 并抛出您自己的异常(如果是这样的话)它是错误的,这是一种糟糕的做法 想象一下,value1可以是整数,并且为null。然后您将捕获一个NullPointerException,但您的代码将告诉您该操作无效,但它不是 例外情况不适用于检查条件。最好明确检查它们: if (getOperator=="/"){ try { sum = value1/value2; } catch (Exception e) {

这里怎么了?

你可以简单地检查一下 值2。等于(0);
并抛出您自己的异常(如果是这样的话)

它是错误的,这是一种糟糕的做法

想象一下,value1可以是整数,并且为null。然后您将捕获一个NullPointerException,但您的代码将告诉您该操作无效,但它不是

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

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

如果值是例如整数,则被零除将引发算术异常,因此这是您应该捕获的


使用Double执行零除会得到一个Double的结果。如果您想通过捕获异常来执行此操作,那么:

     if (getOperator=="/"){
        if (value2 == 0) {
           summaryTxt.setText("Value2 can't be 0!");
        } else {
           sum = value1/value2;
        }
      }
如果不是在这个特定的实例中,捕获
异常
通常肯定是个坏主意。问题是,你很有可能会发现你(程序员)没有预料到的其他类型的异常;e、 g.如果
value1
value2
的类型是原始包装类且值为
null
,则为NullPointerException

您是应该使用异常还是通过显式地测试零来实现这一点也是有争议的。依我看,任何一种方式都可以接受。对于这段代码来说,被零除很可能是罕见的情况,规则是您应该只在异常情况下使用异常。(你不必,但你可以…)

然而,我认为我应该使用显式测试,因为它使代码更易于阅读

if (getOperator == "/") {
    try {
        sum = value1 / value2;
    } catch (ArithmeticException e) {
        summaryTxt.setText("Invalid operation: " + e.getMessage());
    }
}
(旁白:
getOperator==“/”
是不可靠的,除非您的代码保证getOperator始终包含一个内部字符串…)


非常漂亮的代码)

我使用下面的方法来处理通过进行除法:

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

math.stackexchange>


编写一个这样的扩展函数

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

其中,fallback是当divider为0时要返回的值:异常不应用于流控制,特别是当simple
if-else
检查足够时@user655443:如果未显示该消息,则
value2
不为零。因此不会出现被零除的错误在Logcat中,当value2=0但未显示“value2不能为0!”时,这是一个不相关的问题。问另一个问题并展示更多的代码:如何定义summaryTxt,该代码在何处执行,等等。另一方面,缓存异常应该比每次要除法时使用if更快。但仅仅通过阅读代码和上下文,其影响就可以忽略不计。这只是为了包含一个理由,有些人更喜欢捕捉算术错误。这与您的问题没有直接关系,但您永远不应该将字符串与==进行比较。改为使用等于用于比较内存引用。另外,要么使用getter名称getOperator,要么使用更好的名称(如operator)。
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;
}
    Double.safeDiv(other:Number,fallback:Double):Double {
       if(other == 0)
          return fallback
       else 
          return this / other
   }