如何从Java中的堆栈溢出中捕获并恢复?

Sol*_*eus 9 java stack-overflow multithreading

我正在编写一个评分程序,用于学生正在实施递归排序算法.这意味着几个学生可能会输入损坏的代码,导致堆栈溢出.我想以某种方式捕获在调用学生代码时发生的堆栈溢出,以便我可以从他们的分数中扣除并继续进行其他测试.不幸的是,堆栈溢出似乎没有经过其他异常的标准路径 - try/catch块似乎没有帮助.有没有办法在堆栈溢出发生后将执行返回到我的代码?我已经研究过使用线程来做到这一点,但它似乎回到了无法使用try/catch.

Mat*_*yas 14

在调用学生的方法时,你应该在try-catch块中嵌入调用并捕获Exceptions 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();
    }
}

更多信息

赶上Throwables时你会发现:

  • 正常Exceptions - 强制你使用try-catchthrows(例如IOException)
  • RuntimeExceptions - 通过方法冒泡(例如NullPointerException)
  • Errors - 例如. StackOverflowError

请参阅该对象的官方Java DocsThrowable