我需要一个页面为实验抛出异常并添加
#{1/0}
到index.xhtml
。我希望抛出一个java.lang.ArithmeticException
,但是表达式在生成的页面上求值为字符串Infinity
。未定义除以零,并且NaN
可能比Infinity
更好,但是即使NaN
也令人困惑,因为在Java编程语言中用除法处理零是不直观的例外,而不是此返回值。
运行
@PostConstruct
public void init() {
int x = 1/0;
}
在备用bean中的会导致预期的java.lang.ArithmeticException: / by zero
。
除了解释为什么会发生这种情况之外,我还对一种引发异常的方法感兴趣,因为与显示逻辑(或出于该原因而导致不逻辑)字符串相比,我更喜欢在开发过程中应用程序的早期严重崩溃。 >
我仔细检查了大量潜在的重复项(使用其他语言的x/0 == NaN
等),但是对于JSF似乎还没有任何解释。我不是在寻找任何解决方案(没有问题,我只是偶然发现了这种行为),而是一种解释。
我使用Primefaces 6.2体验了这一点。
答案 0 :(得分:2)
有关表达式语言3.0的规范,第1.7.1节对此进行了解释:
“二进制运算符-
A
{/,div}B
- 如果
A
和B
为null
,请返回(Long)0
- 如果
A
或B
是BigDecimal
或BigInteger
,则将两者都强制设为BigDecimal
并返回A.divide(B, BigDecimal.ROUND_HALF_UP)
- 否则,将
A
和B
都强制转换为Double
并应用运算符- 如果运算符导致异常,则错误。”
在这种情况下,A
和B
是整数,因此它们被强制为Double
,并且使用IEE 754浮点算法执行除法...得出{{ 1}}。
那么,可能没有办法抛出异常。
有几种方法:
INF
或A
(但不是全部)都是B
,则说明您将获得NPE。null
和BigInteger
情况下,如果BigDecimal
为零,则divide
方法应该抛出ArithmeticException
。参考: