if (getOperator=="/"){
try {
sum = value1/value2;
} catch (Exception e) {
summaryTxt.setText("Invalid operation");
}
}
这里有什么问题?
答案 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
一般来说绝对是一个坏主意,如果不是在这个特定情况下。问题是你很有可能会遇到你(程序员)没有预料到的其他异常;例如如果value1
或value2
的类型是原始包装类且值为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时要返回的值