gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:16:08 25 4
gpt4 key购买 nike

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

#{1/0}

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

运行

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

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

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

我仔细检查了可能重复的大量列表(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 float 执行除法算术 ... 产生 INF

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

有几种方法:

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

引用:

关于java - 为什么使用 JSF 在 EL 中为#{1/0} 生成 "Infinity"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51453420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com