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

如何在Java中捕获堆栈溢出并从中恢复?,java,multithreading,stack-overflow,Java,Multithreading,Stack Overflow,我正在为一项作业编写一个评分程序,在该作业中,学生们正在实施递归排序算法。这意味着一些学生可能会提交导致堆栈溢出的坏代码。我想以某种方式捕捉调用学生代码时发生的堆栈溢出,这样我就可以从他们的分数中扣除并继续进行其他测试。不幸的是,堆栈溢出似乎没有通过其他异常的标准路径-try/catch块似乎没有帮助。有没有办法在堆栈溢出发生后将执行返回到我的代码?我已经研究过使用线程来实现这一点,但它似乎又不能使用try/catch了。您可以使用新的进程启动他们的程序,然后重定向其错误流以检查堆栈溢出。调用学

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

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

调用学生的方法时,您应该将调用嵌入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(); } } 公开课考试{ /** *@param args */ 公共静态void main(字符串[]args){ 试一试{ soe(); }捕获(可丢弃的e){ System.out.println(“捕获:+e +“,一切都比预期的好。”); } } /** *产生堆栈溢出错误的方法 */ 公共静态无效soe(){ soe(); } } 更多信息

捕捉可丢弃的
s时,您将捕捉到:

  • 正常
    异常
    s-强制您使用
    尝试捕获
    抛出
    (例如
    IOException
  • RuntimeException
    s-通过方法(例如
    NullPointerException
    )产生的异常
  • 错误
    s-例如
    堆栈溢出错误

请参阅可丢弃对象上的。您可以尝试在单独的jvm中运行每个程序。

不需要这样做-请参阅下面Matyas的答案。这是一个简单的问题。错误和异常都是Throwable的子类,这就是错误通过正常异常捕获的原因。它是这样设计的,这样程序员就不会轻易地避免严重故障(Java中的错误)。@Matyas:但在那一点上,程序是否可以继续,即堆栈是否会被重置,或者由于没有可用的堆栈空间,进一步尝试做任何事情是否会失败?是的,它可以继续。当
可丢弃文件“冒泡”时,方法分配将从堆栈中删除。上面的代码中已经有一个简单的证明,当在
catch
块中我们调用一个新方法(
println
)时,它会在堆栈上分配。