3
class ex1
{
    static void my() {
        System.out.println("asdsdf");
    }

    public static void main(String args[]) {

        try {
            for (;;) {
                my();
            }
        } catch (Exception e)//Exception is not caught //Line 1
        {
            System.out.println("Overflow caught");
        } finally {
            System.out.println("In Finally");
        }
        System.out.println("After Try Catch Finally...");

    }
}

catch ステートメント (1 行目) はオーバーフロー例外を処理しません。そのため、出力は例外をスローせずに「asdsdf」を出力し続けます。無限ループが例外として処理されない理由を誰か教えてもらえますか? それとも、それが設計され、機能するはずの方法ですか?

4

4 に答える 4

7

例外はスローされないため、キャッチされません。あなたのメソッドは、OverflowException を引き起こすために何もしません。

無限ループは、Java では完全に合法です。無期限に稼働し続けます。あなたのループはまた、より多くのリソースを構築していません。標準出力に出力した後、すべての反復を自己破壊する単一のメソッドを呼び出すだけです。それは永遠に続く可能性があります。

たとえば、メソッドmy();ITSELF で単純に を呼び出すとmy()、すぐに が返されますが、これはループStackOverflowErrorの最初の繰り返しで発生します。for(;;)

于 2013-08-21T03:58:42.453 に答える
1

「オーバーフロー」状態を作成するには、実際に何かをオーバーフローさせる必要があります。変数のように。

forステートメントを変更して何かをインクリメントしますが、ループの連続性に制約を課さないと、整数オーバーフローが発生します。

for (int i=0;;i++) {
}

あるいは、

for (int i=0;i==i;i++) { // i==i is always true.
}

もう 1 つの方法は、自分自身を無制限に再帰的に呼び出すことによって、コール スタック オーバーフローを引き起こすことです。各再帰呼び出しは、前の再帰呼び出しのスタックを保持する必要があります。

再帰関数:

public static my(){
  my();
}

再帰コンストラクター:

class My {
  My my;
  My() {
     try{
       my = new My();
     }
     catch (Exception e){
        // print exception.
     }
  }
}
于 2013-08-21T04:51:00.920 に答える
0

それが設計され、動作するように意図された方法です -基本的にそれが不可能であることを意味する停止問題と呼ばれるものがあります.

一方、メソッドが再帰的である場合、例外がスローされるまで、ますます多くのスタック スペースを消費します。

于 2013-08-21T04:06:30.790 に答える