为什么我的下面的代码给出了java.lang.StackOverflowError异常?

时间:2017-04-11 10:16:58

标签: java

我无法理解,为什么我的代码会给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());
    }

}

3 个答案:

答案 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,这对于大多数进程来说已经足够了。在异常情况下,堆栈限制超过。这称为堆栈溢出。 两个最常见的原因:

  1. 无限递归

     int f(){ 
                g();
                }
                int g() {
                f(); 
                }
    
  2. 分配大小超过堆栈限制

  3. public int test(){
    
    int x[10000000]; // array is too large 
    
    int y =0; //y's address exceeds the stack's limits, error
    
    }