我正在编写一个评分程序,用于学生正在实施递归排序算法。这意味着几个学生可能会输入损坏的代码,导致堆栈溢出。我想以某种方式捕获在调用学生代码时发生的堆栈溢出,以便我可以从他们的分数中扣除并继续进行其他测试。不幸的是,堆栈溢出似乎没有经过其他异常的标准路径 - try / catch块似乎没有帮助。有没有办法在堆栈溢出发生后将执行返回到我的代码?我已经研究过使用线程来做这件事,但它似乎又回到了无法使用try / catch。
答案 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-catch
或throws
(例如IOException
)RuntimeException
s - 通过方法冒泡(例如NullPointerException
)Error
s - 例如。 StackOverflowError
请参阅Throwable
对象
答案 1 :(得分:2)
您可以使用新的Process
启动程序,然后重定向其错误流以检查堆栈溢出。
答案 2 :(得分:1)
您可以尝试在单独的jvm中运行每个程序。