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

时间:2012-02-16 17:32:26

标签: java multithreading stack-overflow

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

3 个答案:

答案 0 :(得分:14)

在调用学生的方法时,您应该将调用嵌入到try-catch块中,并将Exception标记为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 s - 强制您使用try-catchthrows(例如IOException
  • RuntimeException s - 通过方法冒泡(例如NullPointerException
  • Error s - 例如。 StackOverflowError

请参阅Throwable对象

上的official Java Docs

答案 1 :(得分:2)

您可以使用新的Process启动程序,然后重定向其错误流以检查堆栈溢出。

答案 2 :(得分:1)

您可以尝试在单独的jvm中运行每个程序。