2017-08-02 12 views
1

誰でもStackOverFlowErrorの動作を説明できますか?StackOverFlowError処理とJavaリカバリ

StackOverFlowErrorは無限再帰を引き起こしますが、スタックがいっぱいになってから他のメソッドが実行されることはありますか?私はcatchブロックでエラーを処理しました。私は、Javaの機能や、キャッチされたエラーから回復する方法を知りたいと思います。

サンプルコード:

public class Test {  
    public static void main(String[] args) {  
     try { 
      show(); 
     } catch(StackOverflowError e) { 
      System.out.println(e); 
     }  
     System.out.println("After StackOverFlowError"); 

     display();  
    } 

    static void show() { 
     show(); 
    } 

    static void display() { 
     System.out.println("Hello New Function"); 
    }  
} 

、出力は次のとおりです。ティムは、あなたはそれが可能である代わりにあれば、StackOverflowErrorが処理されません言ったように

java.lang.StackOverflowError 

After StackOverFlowError 

Hello New Function 

+1

通常、実行時例外である 'StackOverflowError'から回復しません。再帰が爆発するなら、コードを修正するか、別の条件で再実行してみてください。 –

+0

私はあなたが質問を得ていないと思います。 StackOverFlowErrorは、それがどのように動作し、Javaがそれから回復するかを理解するために意図的に生成されています。私の質問は、無限の再帰の後、スタックがいっぱいであれば、技術的に他のメソッドをスタックにプッシュする必要がないので、display()はどのように呼び出されますか? Javaはそれから回復しましたか? – Divyanshi

+1

あなたは例外をキャッチしました、あなたは何かに驚いていますか?再帰はまだ死んでしまった。もしあなたが結果を期待していたら、おそらくそれは得られないだろう。通常、実際には 'StackOverflowError'のようなチェックされていない例外をキャッチしません。 –

答えて

1

はい、それから回復しました。 StackOverflowErrorがスローされると、catchブロックに戻るまで、すべてのshow()メソッドを通してスタックが巻き戻されます。この時点ではスタック上にmain()だけが残されており、問題なくプログラムを実行し続けることができます。

あなたのコールスタックは、次のようになります。最後のショー()メソッドは、それはそれを-thorwsし直す各showメソッドにそれをスローする例外を取得するときに

main() 
    show() 
     show() 
     show()... 

しかし深いあなたのスタックメモリは、それが行くことができますあなたのメインのキャッチブロックに到達するまで、エラーが表示されます。

+0

説明をありがとう。 – Divyanshi

0

反復のようなより良いアプローチを試みるか、いくつかの呼び出しの後で呼び出しスタックを終了します。

+0

私はあなたが質問を得なかったと思います。 StackOverFlowErrorは、それがどのように動作し、Javaがそれから回復するかを理解するために意図的に生成されています。私の質問は、無限の再帰の後、スタックがいっぱいであれば、技術的に他のメソッドをスタックにプッシュする必要がないので、display()はどのように呼び出されますか? Javaはそれから回復しましたか? – Divyanshi

+0

ああ、スニペットに示されているように、実行中のスレッドでエラーが発生している限り、確実に回復します。一番上の呼び出しにエラーがスローされるようにすると、アプリケーション/実行中のスレッドはエラーを受け取り、処理していないので終了します(システム終了)。 –