【发布时间】:2016-03-07 15:01:41
【问题描述】:
据我所知,这段代码应该抛出 StackOverflowError,但事实并非如此。可能是什么原因?
public class SimpleFile {
public static void main(String[] args) {
System.out.println("main");
try{
SimpleFile.main(args);
}
catch(Exception e){
System.out.println("Catch");
}
finally{
SimpleFile.main(args);
}
}
}
【问题讨论】:
-
我猜是因为 main 是一个静态方法不是在堆栈上创建的,而是在堆的 PermGen 部分创建的,所以每次我们调用它时,前一个实例都会丢失,如果你把这个代码
new SimpleFile().abc()紧跟在后面你的 main 方法和 create 方法void abc() {abc(); }然后肯定会抛出 stackoverflow 异常,因为非静态方法是在堆栈上创建的。 -
@3kings 这毫无意义。你是说像
void foo() {System.out.println("foo"); foo(); }这样的简单方法不会引发堆栈溢出吗? -
@Aamir 这不是答案吗?
-
@eis 我不确定这是否是原因
-
@Aamir 我猜不是
public class A { public static void main(String[] args) { A.test(); } public static void test() { A.main(null); } }
标签: java exception exception-handling stack-overflow