2011-05-06 86 views
0
if (getOperator=="/"){ 
    try { 
     sum = value1/value2; 
    } catch (Exception e) { 
     summaryTxt.setText("Invalid operation"); 
    } 
} 

这里有什么问题?如何处理除以0

+2

这是不直接关系到你的问题,但你永远不应该用==比较字符串。改用Equals。 ==用于比较内存引用。此外,要么使用getter名称getOperator,要么使用missing(),要么使用更好的名称(如运算符)。 – 2011-05-06 08:24:42

回答

6

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

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

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

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

它仍然不显示“值2不能为0!” – user65544 2011-05-06 07:48:41

+1

+1:不应该将异常用于流量控制,特别是当简单的“if-else”检查就足够了。 @ user655443:如果它不显示那条消息,那么'value2'不是零。因此不会出现除零误差。 – 2011-05-06 07:51:13

+0

我尝试,如果(getOperator == “/”){ \t \t { \t如果(值2 == 0){ \t \t Log.d( “测试”, “EEEE”); \t summaryTxt.setText(“”+“Value2不能为0!”); \t} else { \t sum = value1/value2; \t} \t} \t} – user65544 2011-05-06 07:54:12

1

你可以简单地检查是否 Value2.equals(0); 并抛出你自己的例外如果是的话

2

如果值为例如0,则除零除外将抛出ArithmeticException。整数,所以这就是你应该捕获的。

通过使用零个表演双打部门将代替,结果,可为Double.Infinity

1

如果您想通过捕捉异常,然后做到这一点:

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

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

您是否应该使用异常或通过显式测试零来实现这一点也是有争议的。国际海事组织,无论哪种方式可以接受在这里。除以零分区很可能是此代码罕见的情况,规则是您应该只在特殊情况下使用例外。 (你不必,但你可以...)

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

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

(旁白:getOperator == "/"是不可靠的,除非你的代码保证是getOperator总是包含intern'ed字符串...)

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

这么漂亮的代码)

2

我用的是以下处理除以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 >>I have learned that 1/0 is infinity, why isn't it minus infinity?