如何强制Java在除以0.0或从负双精度中提取根时抛出算术异常?代码如下:
double a = 1; // or a = 0 to test division by 0
double b = 2;
double c = 100;
double d = b*b - 4*a*c;
double x1 = (-b - Math.sqrt(d)) / 2 / a;
double x2 = (-b + Math.sqrt(d)) / 2 / a;
答案 0 :(得分:12)
不可能使Java为这些操作抛出异常,因为Java实现了浮点运算的IEEE 754标准,该标准要求这些操作应返回具有“非数字”或“无限”含义的特定位模式”
如果您想特别处理这些情况,可以将结果与相应的常量(如Double.POSITIVE_INFINITY
)进行比较(对于NaN,您必须使用isNAN()
方法,因为NaN!= NaN)。请注意,您不必在每次单独操作后进行检查,因为后续操作将保持NaN或Infinity值。只需检查最终结果。
答案 1 :(得分:2)
我认为,你必须手动检查,例如
public double void checkValue(double val) throws ArithmeticException {
if (Double.isInfinite(val) || Double.isNaN(val))
throw new ArithmeticException("illegal double value: " + val);
else
return val;
}
所以对你的例子
double d = checkValue(b*b - 4*a*c);
double x1 = checkValue((-b - Math.sqrt(d)) / 2 / a);
double x2 = checkValue((-b + Math.sqrt(d)) / 2 / a);
答案 2 :(得分:-1)
此代码将抛出ArithmeticException
:
int x = 1 / 0;