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

时间:2018-07-21 06:21:12

标签: java jsf el

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

#{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体验了这一点。

1 个答案:

答案 0 :(得分:2)

有关表达式语言3.0的规范,第1.7.1节对此进行了解释:

  

“二进制运算符-A {/,div} B

     
      
  • 如果ABnull,请返回(Long)0
  •   
  • 如果ABBigDecimalBigInteger,则将两者都强制设为BigDecimal并返回A.divide(B, BigDecimal.ROUND_HALF_UP)
  •   
  • 否则,将AB都强制转换为Double并应用运算符
  •   
  • 如果运算符导致异常,则错误。”
  •   

在这种情况下,AB是整数,因此它们被强制为Double,并且使用IEE 754浮点算法执行除法...得出{{ 1}}。

  

那么,可能没有办法抛出异常。

有几种方法:

  • 如果INFA(但不是全部)都是B,则说明您将获得NPE。
  • nullBigInteger情况下,如果BigDecimal为零,则divide方法应该抛出ArithmeticException

参考: