我无法理解,为什么我的代码会给java.lang.StackOverflowError
例外?有人可以简要介绍一下java.lang.StackOverflowError
例外的原因吗?
public class BasicProg {
BasicProg b = new BasicProg();
int show() {
return (true ? null : 0);
}
public static void main(String[] args) {
BasicProg b = new BasicProg();
System.out.println(b.show());
}
}
答案 0 :(得分:1)
您正在获取递归,因为basicProg
类的构造函数被无限次调用。
public class basicProg {
// everytime a new basicProg object is created, another one will
// be created here, and so on...
basicProg b = new basicProg();
int show() {
return (true ? null : 0);
}
public static void main(String[] args) {
basicProg b = new basicProg();
System.out.println(b.show());
}
}
我不知道为什么你的basicProg
班级甚至有这个参考。如果删除它并进行一些更改,则代码应按预期运行:
public class BasicProg {
public Integer show() {
return (true ? null : 0);
}
public static void main(String[] args) {
BasicProg b = new BasicProg();
Integer result = b.show();
System.out.println(result == null ? "null" : result.toString());
}
}
答案 1 :(得分:0)
您有一个类成员basicProg
,当您创建new basicProg()
的新实例时,该成员会被实例化。
这将调用b
创建一个新实例并实例化StackOverflowError
等等。这就是为什么你得到@RunWith(Cucumber.class)
@CucumberOptions(plugin={"pretty","html:format"},
features = "Features/name.feature",glue={"path where step definitions exist"})
public class RunnerClass {
}
。
顺便说一句。 Java命名约定说,类名应该以大写字符
开头答案 2 :(得分:0)
因为在您的 BasicProg 类对象中创建了递归。 here doc
堆栈是内存的一部分。在此堆栈上创建本地自动变量,并传递方法参数。当进程启动时,它会获得一个默认的堆栈大小,该大小对于每个进程都是固定的。在今天的操作系统中,通常,默认堆栈大小为1 Mb,这对于大多数进程来说已经足够了。在异常情况下,堆栈限制超过。这称为堆栈溢出。 两个最常见的原因:
无限递归
int f(){
g();
}
int g() {
f();
}
分配大小超过堆栈限制
public int test(){ int x[10000000]; // array is too large int y =0; //y's address exceeds the stack's limits, error }