簡體   English   中英

為什么,在Java算法中,溢出或下溢永遠不會拋出異常?

[英]Why, In Java arithmetic, overflow or underflow will never throw an Exception?

在Java算術運算期間,JVM不會拋出下溢或溢出異常。 很多時候,我們遇到了意想不到的結果,並想知道出了什么問題。

在.NET技術的情況下,我們有溢出和Undeflow異常。

所以我的問題是,為什么Java設計不會在算術運算期間拋出此異常

這可能是多種因素的組合:

  1. Java之前的大語言使用未經檢查的算術。 容易出現數值溢出的眾所周知的算法傾向於在不依賴於檢查算術的情況下解釋潛在的溢出。
  2. 經過檢查的算術會在大量使用算術指令的算法中引入顯着的開銷,這會使Java處於顯着的劣勢,特別是對於基准測試而言。
  3. 一些算法依賴於靜默數值上溢/下溢。 如果檢查了算術運算,重寫這些算法很快就會變得非常重要。
  4. 檢查算術不是確保內存安全所必需的(與其他JVM檢查相反,如空指針和數組邊界)。

.NET虛擬執行環境(現在是ECMA-335標准的一部分)為已檢查和未檢查的算法引入了單獨的指令,使其能夠獨立地解決使用現代托管語言的開發人員的性能和安全問題。

Indoknight說,這可能與性能有關。 Java提供了處理溢出的工具,因此如果您需要檢測它,您可以執行此操作。 你也有long和BigInteger,可以使用它們來避免你的int溢出。

你應該從stackoverflow中的類似問題看到這個答案。 Java如何處理整數下溢和溢出以及如何檢查它?

當Java最初創建時,語言設計者就是這樣做的。 我不確定為什么,但是如果有它肯定會在提高例外方面有性能損失。

“語言設計者的教訓是,可能值得減少靜默溢出的可能性。這可以通過提供對不會無聲溢出的算術的支持來完成。程序可以拋出異常而不是溢出,就像Ada一樣,或者他們可以Lisp會自動切換到更大的內部表示,以避免溢出.Lisp也是如此。這兩種方法都可能會對它們產生性能損失。另一種降低靜默溢出可能性的方法是支持目標類型,但這會增加型號系統[Modula-3 1.4.8]。“

禮貌--Jackhua Bloch和Neal Gafter的Java益智游戲陷阱和陷阱

Java基於C和C ++,它基於Assembly。 在這些語言中都沒有拋出異常,部分原因是在設計算術運算時,異常不在那些語言中。

首先使用較大的類型(如longdoubleBigIntegerBigDecimal更安全,如果您確定這是不合適的,則只使用較小的類型。

如果您使用這些更寬泛的類型,它不一定是常見問題。

暫無
暫無

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

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