为什么使用 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."
在这种情况下,A
和 B
是整数,因此它们被强制转换为 Double
并使用 IEE 754 浮点运算执行除法...导致INF
.
There's probably no way to thrown an exception, then.
有几种方法:
- 如果
A
或 B
(但不是两者)是 null
,则规范暗示您将获得 NPE。
- 在
BigInteger
和 BigDecimal
情况下,如果 B
为零,divide
方法应该抛出一个 ArithmeticException
。
参考:
- JSR-000341 表达式语言 3.0 - http://download.oracle.com/otndocs/jcp/el-3_0-fr-eval-spec/index.html
我需要一个页面来为实验抛出异常并添加
#{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
andB
arenull
, return(Long)0
- If
A
orB
is aBigDecimal
or aBigInteger
, coerce both toBigDecimal
and returnA.divide(B, BigDecimal.ROUND_HALF_UP)
- Otherwise, coerce both
A
andB
toDouble
and apply operator- If operator results in exception, error."
在这种情况下,A
和 B
是整数,因此它们被强制转换为 Double
并使用 IEE 754 浮点运算执行除法...导致INF
.
There's probably no way to thrown an exception, then.
有几种方法:
- 如果
A
或B
(但不是两者)是null
,则规范暗示您将获得 NPE。 - 在
BigInteger
和BigDecimal
情况下,如果B
为零,divide
方法应该抛出一个ArithmeticException
。
参考:
- JSR-000341 表达式语言 3.0 - http://download.oracle.com/otndocs/jcp/el-3_0-fr-eval-spec/index.html