为什么我下面的代码会给出java.lang.StackOverflowerr异常?
我不明白,为什么我的代码会给出java.lang.StackOverflowerr异常?有人能简单介绍一下为什么会出现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
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
}