如何强制Java抛出算术异常?

2022-09-04 20:32:21

如何强制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;

答案 1

不可能使 Java 为这些操作引发异常。Java实现了用于浮点算术的IEEE 754标准,该标准要求这些操作应返回具有“Not a Number”或“Infinity”含义的特定位模式。遗憾的是,Java 没有实现标准为无效操作描述的用户可访问状态标志或陷阱处理程序。

如果你想特别处理这些情况,你可以将结果与相应的常量进行比较,如Double.POSITIVE_INFINITY(对于NaN,你必须使用isNAN()方法,因为NaN != NaN)。请注意,您不必在每次单独操作后进行检查,因为后续操作将保留 NaN 或无穷大值。只需检查最终结果即可。


答案 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);