簡體   English   中英

為什么使用JSF為EL中的#{1/0}生成“無限”?

[英]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

  • 如果ABnull ,則返回(Long)0
  • 如果ABBigDecimalBigInteger ,則強制轉換為BigDecimal並返回A.divide(B, BigDecimal.ROUND_HALF_UP)
  • 否則,將AB強制轉換為Double並應用運算符
  • 如果運算符導致異常,則出錯。“

在這種情況下, AB是整數,因此它們被強制為Double並且使用IEE 754浮點運算執行除法...導致INF

那么可能沒有辦法拋出異常。

有辦法:

  • 如果AB (但不是兩者)都為null ,則規范暗示您將獲得NPE。
  • BigIntegerBigDecimal情況下,如果B為零,則divide方法應拋出ArithmeticException

參考:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM