[英]Why is “Infinity” generated for #{1/0} in EL with JSF?
我需要一個頁面來為實驗拋出異常並添加
#{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體驗過這一點。
這可以通過Expression Language 3.0,Section 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浮點運算執行除法...導致INF
。
那么可能沒有辦法拋出異常。
有辦法:
A
或B
(但不是兩者)都為null
,則規范暗示您將獲得NPE。 BigInteger
和BigDecimal
情況下,如果B
為零,則divide
方法應拋出ArithmeticException
。 參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.