2010-03-29 103 views
15

你可以嘗試/捕捉java中的堆棧溢出異常嗎?它似乎正在拋棄自己的方式。當我的程序溢出時,我想「懲罰」該值。嘗試/抓住堆棧溢出在Java?

+12

預防勝於捕好.... – 2010-03-29 04:02:12

+4

捕捉對調試很有:) – JonnyBoy 2014-11-06 00:11:38

回答

22

似乎工作:

public class Test { 

    public static void main(String[] argv){ 
     try{ 
      main(null); 
     } 
     catch(StackOverflowError e){ 
      System.err.println("ouch!"); 
     } 
    } 

} 
+1

啊我用一個通用的異常努力。謝謝! – stereos 2010-03-29 04:06:29

+0

我同意找出是什麼導致異常,並防止它會更好,雖然。 – Thilo 2010-03-29 04:07:41

+8

@stereos你是不是想抓住'Exception'? 'Error'直接擴展'Throwable',而不是'Exception'。 – 2010-03-29 04:19:38

7

如果你得到一個堆棧溢出,你很可能試圖無限遞歸或受到嚴重濫用的功能調用。也許你可能會考慮讓你的一些過程迭代而不是遞歸,或者仔細檢查你的遞歸​​過程中是否有正確的基本情況。捕捉堆棧溢出異常是一個壞主意;你正在治療症狀而不解決潛在的原因。

+0

在使用JVM設置選項的遞歸和溢出的情況下,SO是正確程序的正常否定答案。我們必須抓住它並做出反應。例如,在延遲序列的情況下,通過遞歸finction(http://stackoverflow.com/a/33926444/715269)進行設置,我們可以簡單地通過更小的步驟繼續。 – Gangnus 2015-12-21 07:52:13

+1

捕捉SO錯誤對於調試時也很有用,當你不知道許多遞歸方法中的哪一個導致SO錯誤時:) – 2016-01-23 11:39:36

0

我同意邁克爾 - StackOverflowException是一個信號,有些事情變得非常錯誤。吞嚥它並不是一個好主意。最好的行動方式是解決這個錯誤的根本原因。

+0

提問者說他​​想吞下去的地方?相反,他主張「懲罰價值」 – Gangnus 2015-12-21 07:54:08

+0

我的理解是OP想要捕捉StackOverflowException以便在處理異常時提供一些自定義邏輯(懲罰)。而且,我們又回到了「不容錯誤」的方方面面。 – 2016-01-02 09:34:57

+0

我再次重申:在使用遞歸的情況下,SO具有完全不同的含義:你跳得太深,重複它以更淺的步驟分割。 – Gangnus 2016-01-03 23:48:31

4

你必須趕上一個錯誤,而不是例外

2

的Java 8的功能特點,使無比這個問題更重要。當我們開始大量使用遞歸時,StackOverflowException是我們必須考慮的。

Java 8 lambda類型沒有引發StackOverflowException的人。所以,我們必須創造這樣的。這是絕對必要的,沒有,我們甚至不會通過IDE控制。

例如,整型 - >整數函數類型可以爲看:

@FunctionalInterface 
public interface SoFunction <U> { 
    public U apply(Integer index) throws StackOverflowException; 
} 

在此之後,我們可以寫一個接受lambda表達式拋出StackOverflowException的功能。

public T get(int currentIndex) throws StackOverflowException{ 

而且,只有現在我們可以創建一個遞歸拉姆達:

fiboSequence.setSequenceFunction(
      (i) -> 
      fiboSequence.get(i-2).add(fiboSequence.get(i-1)) 
); 

之後,我們可以調用遞歸鏈fiboSequence.get(i),並得到一個結果或StackOverflowException如果整個鏈條是數不清的。

在使用遞歸的情況下,SO得到了完全不同的含義:你已經跳得太深了,重複它以更淺的步驟進行劃分。

1

這裏是我的解決方案,

public class TryExample { 

    public static void main(String[] args){ 
     try { 
      int no=10/0; 
     } catch (Exception e) { 
      System.err.println("Arithmetic Exception occurs!"); 
     } 
    } 
} 
+0

您的解決方案適用於幾年前已採用適當方式回答的問題嗎?你意識到捕獲'Exception'是OP已經嘗試過的東西,顯然不起作用? – Tom 2017-06-23 07:51:57