3

try-catch-finallyinの実行順序を把握してみましたjava。実行順序は

  1. 試す
  2. catch (エラーが発生した場合/例外がキャッチされた場合)
  3. 最終的に (例外がキャッチされたかどうか)

しかし、私は次の結果と混乱しています

public class TryCatchFinally {
static int i = 0;
public static void main(String[] args) {
    try {
        System.out.println(i++);
        main(args);
    } catch (StackOverflowError e) {
        System.out.println("Catch");
    } finally {
        System.out.println("Finally");
    }
 }
}

アウトプット(アウトプットの一部)

9127
9128
9129
9130
CatcFCatch // what is the wrong here???
Finally
Finally // there are more Finally printed here.

私の質問は、ここで実際に何が起こっているのですか?

印刷されない理由をさらに追加させてください"Catch"???

でこれを実行すると、これが出力されIntelliJ IDEAます。しかし、私が実行するterminalと、次のように出力されます。

9151
9152
9153
9154CatchFinallyCatch
Finally
Finally
Finally
Finally
4

3 に答える 3

7

コール内のどこかでスタックオーバーフロー エラーが発生しprintln(おそらく、何らかのフラッシュが行われているなどの理由で)、printlnメソッドが一貫性​​のない状態のままになる可能性があります (本来あるべき状態の一部が出力されます)。

これは、すでにを処理しているときに簡単に発生します。StackOverflowErrorその時点では、オーバーフローするスタックにすでに危険なほど近づいているためです (問題に非常に近い時点でスタックから回復したため)。

私の解釈は次のようになります。

  • main は自分自身を再帰的に何度も呼び出します ...
  • main を 9130 回再帰的に呼び出す
  • その番号を出力します
  • 9131回目の自称
  • その番号を出力しようとしますがStackOverflowError、スタックがいっぱいであるため、をスローします
  • キャッチを入力して、「キャッチ」を印刷しようとします
  • そのprintln通話中に別のStackOverflowErrorことが起こります
  • catchブロックが(突然)完了したため、最終ブロックが実行されます
  • 「最後に」を印刷しようとします
  • その println通話中にさらに別の StackOverflowErrorことが起こります
  • StackOverflowErrorの9130回目の呼び出しでキャッチされますmain
  • 「Catch」を出力します(スタックが1要素短くなったため、成功しました!)
  • Finallyスタックが 1 要素短くなったため、finally ブロックが実行され、正常に出力されます。
  • さらに最終ブロックが実行されます。
于 2013-11-06T10:08:05.800 に答える
1

これは、main への再帰呼び出しが原因です。したがって、main で main を呼び出しているため、try catch ブロックを複数回入力しており、最初の StackOverflow の発生後に入力したのと同じ回数だけそこから戻っています。これが複数のフィナリーの理由です。

編集:合理的な説明なしにいくつかの反対票を見たので、誰かが私が間違っていると思った場合はi、最終ブロックでデクリメントを使用していまいましいカウンターを出力してください。

public static void main(String[] args) {
    try {
        System.out.println(i++);
        main(args);
    } catch (StackOverflowError e) {
        System.out.println("Catch");
    } finally {
        System.out.println("Finally: "+ (i--));
    }
 }
于 2013-11-06T10:08:45.933 に答える
0

IDE (Eclipse など) を使用していますか? はいの場合、それが原因である可能性があります。

ここに私の試みの結果があります -

// コード

public static void main(String[] args) throws IOException {

    File file = new File("resources/ouput.txt");
    file.createNewFile();
    PrintStream printStream = new PrintStream(file);
    System.setOut(printStream);

    overflowTester(0);

}

private static void overflowTester(int index) {
    try {
        System.out.println(index++);
        overflowTester(index);
    } catch (StackOverflowError  e) {
        System.out.println("Catch");
    } finally {
        System.out.println("Finally");
    }
}

// 出力

0
1
2
3
4
5
6
7
8
9
10
...
...
...
9666
Catch
Finally
...
...
Finally

注: '9666' は 9667 行目に出力され、最後の Final は 19336 行目に出力されました。

私の場合、次のプログラムを実行します。

private static int index = 0;

public static void main(String[] args) throws IOException {

    try {
        System.out.println(index++);
        main(args);
    } catch (StackOverflowError  e) {
        System.out.println("Catch");
    } finally {
        System.out.println("Finally");
    }

}

コマンドプロンプトから、同様の結果が得られました:

0
1
2
3
4
5
...
...
9667
Catch
Finally
...
...
Finally

'9667' は 9668 行目に出力され、最後の 'Finally' は 19338 行目に出力されます。

于 2013-11-06T10:55:42.783 に答える