为什么使用 JSF 在 EL 中为 #{1/0} 生成 "Infinity"?

Why is "Infinity" generated for #{1/0} in EL with JSF?

我需要一个页面来为实验抛出异常并添加

#{1/0}

index.xhtml。我希望抛出一个 java.lang.ArithmeticException,但是表达式在生成的页面上计算为字符串 Infinity。除以零没有定义,NaN 可能是比 Infinity 更好的选择,但即使 NaN 也令人困惑,因为它在 Java 编程语言中不直观零被异常处理,而不是这个 return 值。

运行

@PostConstruct
public void init() {
    int x = 1/0;
}

在支持 bean 中导致预期的 java.lang.ArithmeticException: / by zero

除了解释为什么会发生这种情况之外,我还对抛出异常的方法感兴趣,因为我更喜欢在开发过程中应用程序的早期和严重崩溃而不是显示逻辑(或出于该原因的不合逻辑)字符串。

我仔细检查了可能重复的大列表(x/0 == NaN 其他语言等),但似乎还没有对 JSF 的解释。我不是在寻找任何类型的解决方案(没问题,我只是偶然发现了这种行为),而是在寻找解释。

我使用 Primefaces 6.2 遇到过这种情况。

Expression Language 3.0 规范第 1.7.1 节对此进行了解释:

"Binary operator - A {/,div} B

  • If A and B are null, return (Long)0
  • If A or B is a BigDecimal or a BigInteger, coerce both to BigDecimal and return A.divide(B, BigDecimal.ROUND_HALF_UP)
  • Otherwise, coerce both A and B to Double and apply operator
  • If operator results in exception, error."

在这种情况下,AB 是整数,因此它们被强制转换为 Double 并使用 IEE 754 浮点运算执行除法...导致INF.

There's probably no way to thrown an exception, then.

有几种方法:

  • 如果 AB(但不是两者)是 null,则规范暗示您将获得 NPE。
  • BigIntegerBigDecimal 情况下,如果 B 为零,divide 方法应该抛出一个 ArithmeticException

参考: