2011-05-06 43 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?