2
class exception1 {
    public static void main(String s[]) {
        String v[] = new String[2];
        try {
            main(v);
            System.out.println(5 / 0);

        }
        catch (Exception e) // or (ArithmeticException e)
        {
            System.out.println(e); // Java.lang.ArithmeticException: / by zero

        }
        finally {
            System.out.println("AAAA");
        }
        System.out.println("after finally normal execution");
    }
}

このコードを実行すると、stackoverflow エラーが発生するまで無数の AAAA が返されます。私の質問は main(v); です。main を再度呼び出しますが、最終的には実行されます :( ? 制御フローは私の良心から外れています。最後に、main を気にしないほど傲慢ですか?

4

4 に答える 4

4

まず、StackOverflowErrorは であり、ではErrorないExceptionことに注意してくださいcatch (Exception e)

StackOverflowErrorスローされると、その例外がコール スタックに反映されます。スタック フレームが例外的に返されるたびに、finally 句が実行されます。

(0/5あなたがおそらく発見したように、表現は到達可能ではありません.)

これが何が起こるかの写真です:

                                                               Output
main()
   main()
       main()
          ...
             main()

                 throw Stack-overflow!
                 Print AAAA before returning exceptionally     AAAA

             rethrow Stack-overflow!
             Print AAAA before returning exceptionally         AAAA

         ...                                                   ...

      rethrow Stack-overflow!
      Print AAAA before returning exceptionally                AAAA

   rethrow Stack-overflow!
   Print AAAA before returning exceptionally                   AAAA

Uncaught stack-overflow error, print stacktrace.               Exception dump.
于 2012-07-20T07:09:55.110 に答える
2

私はプログラムをデバッグしました、これはフローでした:

main()-> main()->main->........スタックオーバーフロー例外を取得しました->finally->finally->finally->.....メインからメインスレッドに転送されたstackoverflow例外を伴うコントロール()メソッドとメインスレッドがstackoverflow例外を処理しました

出力

AAAA
AAAA
AAAA
AAAA
....
AAAA
AAAA
AAAA
Exception in thread "main" java.lang.StackOverflowError
    at java.util.concurrent.locks.AbstractOwnableSynchronizer.<init>(Unknown Source)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.<init>(Unknown Source)
    at java.util.concurrent.locks.ReentrantLock$Sync.<init>(Unknown Source)
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.<init>(Unknown Source)
    at java.util.concurrent.locks.ReentrantLock.<init>(Unknown Source)
    at java.util.concurrent.ConcurrentHashMap$Segment.<init>(Unknown Source)
    at java.util.concurrent.ConcurrentHashMap.ensureSegment(Unknown Source)
    at java.util.concurrent.ConcurrentHashMap.putIfAbsent(Unknown Source)
    at java.lang.ClassLoader.getClassLoadingLock(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at test.exception1.main(Exception1.java:17)
    at test.exception1.main(Exception1.java:7)
    at test.exception1.main(Exception1.java:7)
    ....
    at test.exception1.main(Exception1.java:7)
    at test.exception1.main(Exception1.java:7)
    at test.exception1.main(Exception1.java:7)
于 2012-07-20T07:29:05.740 に答える
2

プログラムによる説明付きの別の回答..

class TryFinallyDemo
{
    static int counter;

    public static void main(String s[])
    {
        int localCounter=0;
        String v[] = new String[2]; 

        try{ 
            counter++;
            localCounter = counter;
            main(v); 
            System.out.println(5/0);                                     
        } 


        catch(Exception e)  // or (ArithmeticException e) 
        {   
            System.out.println(e); // Java.lang.ArithmeticException: / by zero 
        }                                      

        finally{ System.out.println("AAAA.. Local Counter is " + localCounter);  }      

        System.out.println("after finally normal execution");  

    } 
}

この例は、StackOverflow エラーがスローされた後、スタックがどのように下から上に呼び出されるかを明確に示しています。

出力のスニペット:

AAAA.. Local Counter is 47
AAAA.. Local Counter is 46
AAAA.. Local Counter is 45
AAAA.. Local Counter is 44
AAAA.. Local Counter is 43
AAAA.. Local Counter is 42
AAAA.. Local Counter is 41
AAAA.. Local Counter is 40
AAAA.. Local Counter is 39
AAAA.. Local Counter is 38
AAAA.. Local Counter is 37
AAAA.. Local Counter is 36
AAAA.. Local Counter is 35
AAAA.. Local Counter is 34
AAAA.. Local Counter is 33
AAAA.. Local Counter is 32
AAAA.. Local Counter is 31
AAAA.. Local Counter is 30
AAAA.. Local Counter is 29
AAAA.. Local Counter is 28
AAAA.. Local Counter is 27
AAAA.. Local Counter is 26
AAAA.. Local Counter is 25
AAAA.. Local Counter is 24
AAAA.. Local Counter is 23
AAAA.. Local Counter is 22
AAAA.. Local Counter is 21
AAAA.. Local Counter is 20
AAAA.. Local Counter is 19
AAAA.. Local Counter is 18
AAAA.. Local Counter is 17
AAAA.. Local Counter is 16
AAAA.. Local Counter is 15
AAAA.. Local Counter is 14
AAAA.. Local Counter is 13
AAAA.. Local Counter is 12
AAAA.. Local Counter is 11
AAAA.. Local Counter is 10
AAAA.. Local Counter is 9
AAAA.. Local Counter is 8
AAAA.. Local Counter is 7
AAAA.. Local Counter is 6
AAAA.. Local Counter is 5
AAAA.. Local Counter is 4
AAAA.. Local Counter is 3
AAAA.. Local Counter is 2
AAAA.. Local Counter is 1
Exception in thread "main" java.lang.StackOverflowError
    at java.lang.String.indexOf(String.java:1395)   
于 2012-07-20T07:24:31.130 に答える
1

main(v)操作に到達する前に呼び出される5/0ため、例外はスローされません-無限ループが発生します。

于 2012-07-20T07:10:10.430 に答える