13

Javaでオーバーフローとアンダーフローの例外を取得しようとしていますが、すばらしいチュートリアルを取得できませんでした。具体的に学びたい

  1. それらは互いにどのように異なりますか?
  2. これらの例外のサブクラスは何ですか?
  3. どのシナリオでそれらがスローされますか?
  4. それらのどれをどのように処理できますか?
  5. それらに関連するベストプラクティスは何ですか?

便利なチュートリアルへのリンクは

4

4 に答える 4

30

さて、OPは、スタックオーバーフローと算術オーバーフローの両方、およびそれらに対応するアンダーフローについて知りたいと話しました. ここに行きます....

  1. 算術オーバーフローは、数値が大きすぎてその値の型に収まらない場合に発生します。たとえば、 anは -2 31から 2 31 -1 までintの値を保持します。数値がこれらの制限を超えると、オーバーフローが発生し、数値が「ラップ アラウンド」します。これらにより、Java で例外が生成されることはありません。
  2. 算術アンダーフローは、浮動小数点数が小さすぎてゼロとうまく区別できない場合に発生します (数値の精度が切り捨てられます)。Java では、これらも例外を引き起こしません。
  3. スタック オーバーフローは、別の関数を呼び出す関数を呼び出すと発生し、別の関数を呼び出してから別の関数を呼び出すと、関数の呼び出しスタックが深くなりすぎます。StackOverflowErrorそれが起こるとき、あなたは得ます。
  4. Java ではスタック アンダーフローは発生しません。そのランタイム システムは、そのようなことが起こらないようにすることになっています。

OP の他の質問 (コメントを参照) に答えるには、配列の境界を超えると anIndexOutOfBoundsExceptionが発行されます。

于 2010-01-28T13:39:47.050 に答える
7

Java 演算では、オーバーフローまたはアンダーフローによって例外がスローされることはありません。代わりに、浮動小数点演算の場合、値はNot a number、「無限」、またはゼロとして設定されます。

これらをテストするには、静的メソッドを使用できます: isNaNまたはisInfinite適切なラッパー クラスを使用します。これを適切に処理できます。例:

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

これを処理するための完全なプロジェクト スタイルの方法について、関連する質問をしました。

于 2010-01-28T13:34:04.880 に答える
0

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); }
}
于 2013-11-20T13:18:25.867 に答える