2017-08-02 32 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"); 
    }  
} 

,輸出是:

java.lang.StackOverflowError 

After StackOverFlowError 

Hello New Function 

+1

通常,您不會從StackOverflowError中恢復,這是一個運行時異常。如果遞歸爆炸,就是這樣,修復你的代碼或者嘗試在不同的條件下再次運行它。 –

+0

我想你沒有得到這個問題。 StackOverFlowError是故意生成的,以瞭解它如何工作以及Java如何從中恢復。我的問題是,如果在無盡的遞歸之後,堆棧已滿,技術上沒有其他方法應該推入堆棧,那麼display()如何被調用? java是否從中恢復? – Divyanshi

+1

你發現了這個例外,你對某件事感到驚訝嗎?遞歸仍然死亡,如果你期待結果回來,你可能不會得到它。通常情況下,您在實踐中不會捕獲像'StackOverflowError'這樣的未經檢查的異常。 –

回答

1

是的,Java從中恢復。 當StackOverflowError被拋出時,它通過所有show()方法展開堆棧,直到它返回到catch塊。此時只有main()被留在堆棧上,你可以繼續執行你的程序而不會出現問題。

您調用堆棧將類似於:

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

但是深的堆棧存儲器允許它去,當最後show()方法獲取異常它,它拋出來的每個顯示方法,重新thorws它直到它到達你的main中的catch塊並且打印錯誤。

+0

感謝您的解釋。 – Divyanshi

0

正如蒂姆說,你不處理的StackOverflowError,而是如果可能的話嘗試更好的方法,如迭代或在多次調用後完成調用堆棧。

+0

我想你沒有得到這個問題。 StackOverFlowError是故意生成的,以瞭解它如何工作以及Java如何從中恢復。我的問題是,如果在無盡的遞歸之後,堆棧已滿,技術上沒有其他方法應該推入堆棧,那麼display()如何被調用? java是否從中恢復? – Divyanshi

+0

哦,只要你在運行的線程中發現錯誤,它就會恢復,正如你的代碼片段所示。如果讓錯誤被引發到最上面的調用,那麼應用程序/正在運行的線程將會終止(系統退出),因爲它出錯並且沒有人處理它。 –