簡體   English   中英

常見的下溢和上溢異常

[英]Common underflow and overflow exceptions

我試圖在 Java 中掌握溢出和下溢異常,但找不到任何好的教程。 具體我想學習

  1. 它們之間有何不同?
  2. 這些異常的子類是什么?
  3. 在哪種情況下會拋出它們?
  4. 哪些可以處理?如何處理?
  5. 與它們相關的最佳實踐是什么?

任何有用教程的鏈接都可以

好的,OP 談到想要了解堆棧溢出和算術溢出,以及它們相應的下溢。 開始....

  1. 當一個數字太大而無法放入其值類型時,就會發生算術溢出。 例如, int保存 -2 31和 2 31 -1 之間的值,包括這兩個值。 如果您的號碼超過這些限制,則會發生溢出,並且號碼會“環繞”。 這些不會導致在 Java 中生成異常。
  2. 當浮點數太小而無法與零區分開時(數字的精度被截斷),就會發生算術下溢。 在 Java 中,這些也不會導致異常。
  3. 當你調用一個函數,調用另一個函數,然后調用另一個,然后另一個......並且函數調用堆棧變得太深時,就會發生堆棧溢出。 發生這種情況時,您會收到StackOverflowError
  4. Java 中不會發生堆棧下溢。 它的運行時系統應該可以防止這種事情發生。

要回答 OP 的其他問題(請參閱評論),當您超出數組的邊界時,會發出IndexOutOfBoundsException

在 Java 算術中,上溢或下溢永遠不會拋出異常。 相反,對於浮點算術,該值設置為Not a number 、'infinite' 或零。

要測試這些,您可以使用靜態方法: isNaNisInfinite使用適當的包裝類。 您可以酌情處理。 例子:

double d1 = 100 / 0.;
if (Double.isNaN(d1)) {
    throw new RuntimeException("d1 is not a number");
}
if (Double.isInfinite(d1)) {
    throw new RuntimeException("d1 is infinite");
}

對於某些操作,您可以獲得ArithmeticException ,例如在整數數學中dividing by zero

我剛剛問了一個有關處理此問題的完整項目樣式方式的相關問題

Java 沒有無符號整數。 如果您認為它可能有用,這使得拋出異常變得容易。

public class Counter
{
  private int counter = 0;

  public int increment ()
  {
    counter += 1;
    if (counter < 0)
      throw new RuntimeException ("Counter overflow");
    else
      return counter;
  }

  public String toString() { return String.valueOf(counter); }
}

由於這是一個非常古老的問題,因此應該注意,從 Java 8 開始, Math 包提供了“精確”的算術方法,當發生溢出時會觸發異常。

例如

int iv1 = Integer.MAX_VALUE;
int iv2 = Math.addExact(iv1,1);

會觸發 java.lang.ArithmeticException: integer overflow 。

暫無
暫無

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

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