2012-02-16 35 views
9

我正在爲學生正在實施遞歸排序算法的作業寫一個評分程序。這意味着幾名學生可能會導致破壞的代碼,導致堆棧溢出。我想以某種方式捕獲調用學生代碼時發生的堆棧溢出,以便我可以從他們的分數中扣除並繼續進行其他測試。不幸的是,堆棧溢出似乎沒有經過其他異常的標準路徑 - try/catch塊似乎沒有幫助。發生堆棧溢出後,是否有辦法將執行返回到我的代碼?我研究過使用線程來做到這一點,但它似乎回到了不能使用try/catch。如何從Java中的堆棧溢出中捕獲和恢復?

回答

14

在調用學生的方法時,應該將調用嵌入到try-catch塊中,並將Exception s作爲Throwables

請看下面的代碼:

 
public class Test { 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     try { 
      soe(); 
     } catch (Throwable e) { 
      System.out.println("Caught:" + e 
        + ", everything went better than expected."); 
     } 
    } 
    /** 
    * Method producing StackOverflowError 
    */ 
    public static void soe() { 
     soe(); 
    } 
} 

更多信息

醒目當Throwable是你會趕上:

  • 普通Exception秒 - 這強制你使用try-catchthrows (例如,IOException
  • RuntimeException s - 通過方法(例如, NullPointerException
  • Error s - 例如, StackOverflowError

Throwable對象

+1

這個。錯誤和異常都是Throwable的子類,這就是錯誤通過正常的Exception-catch的原因。它被設計成如此嚴重的失敗(這是Java中的錯誤)不會被程序員輕易繞過。 – 2012-02-16 17:44:30

+0

@IbrahimArief:感謝您指點基礎知識。這有助於 – Jayy 2012-02-16 17:50:11

+0

非常好,謝謝! – Solaraeus 2012-02-16 18:03:14

2

您可以使用新的Process來關閉程序,然後重定向其錯誤流以檢查堆棧溢出。

+0

沒有必要 - 請參閱下面的Matyas的答案。 – 2012-02-16 17:38:03