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

为什么我下面的代码会给出java.lang.StackOverflowerr异常?,java,Java,我不明白,为什么我的代码会给出java.lang.StackOverflowerr异常?有人能简单介绍一下为什么会出现java.lang.StackOverflowerr异常吗 public class BasicProg { BasicProg b = new BasicProg(); int show() { return (true ? null : 0); } public static void main(String[] arg

我不明白,为什么我的代码会给出java.lang.StackOverflowerr异常?有人能简单介绍一下为什么会出现java.lang.StackOverflowerr异常吗

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());
    }

}
您有一个类成员b,它在创建BasicLog的新实例时被实例化。 这将调用newbasicprog,它创建了一个新实例并实例化了b,依此类推。这就是为什么你得到了堆栈溢出错误


顺便说一句,Java命名约定说,类名应该以大写字符开头,因为BasicLog类的构造函数被调用的次数是无限的

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());
   }
}
我不知道你的BasicLog类为什么会有这样的引用。如果将其删除并进行一些更改,则代码的行为应符合预期:

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());
   }
}
因为在BasicLog类中,对象是递归创建的

堆栈是内存的一部分。本地自动变量在此堆栈上创建,并传递方法参数。当一个进程启动时,它会得到一个默认的堆栈大小,该大小对于每个进程都是固定的。在今天的操作系统中,通常默认堆栈大小为1MB,这对于大多数进程来说已经足够了。在异常情况下,堆栈限制超过。这称为堆栈溢出。 两个最常见的原因:

无限递归

 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

}