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