gpt4 book ai didi

调用方法时出现 java.lang.StackOverflowError

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:08:54 24 4
gpt4 key购买 nike

我正在学习界面行为。我创建了一个接口(interface)及其实现类,在调用方法 m1() 时出现了 java.lang.StackOverflowError。我不知道为什么。谁能告诉我这背后的正当理由!!!!!! 这是代码:

public interface Employee {
String name="Kavi Temre";
}

public class Kavi implements Employee{
Employee e= new Kavi();
public static void main(String[] args) {

Kavi kt=new Kavi();
kt.m1();
}

void m1()
{
System.out.println(Employee.name);
//System.out.println(e.name);
}
}

两个 sysout 都给出相同的错误:请告诉我这里到底发生了什么??

控制台输出:

Exception in thread "main" java.lang.StackOverflowError
at Kavi.<init>(Kavi.java:2)
at Kavi.<init>(Kavi.java:2)
at Kavi.<init>(Kavi.java:2)
at Kavi.<init>(Kavi.java:2)
at Kavi.<init>(Kavi.java:2)
at Kavi.<init>(Kavi.java:2)
at Kavi.<init>(Kavi.java:2)
.....

最佳答案

当你打电话时

Kavi kt=new Kavi();

它初始化 e 成员:

Employee e = new Kavi();

然后初始化它自己的 e 成员,这为您提供了对 Kavi 构造函数的无限调用链。因此 StackOverflowError。

相当于:

Employee e;
public Kavi ()
{
e = new Kavi();
}

构造函数不应在无限循环中调用自身。

删除 Employee e = new Kavi() 行将解决您的问题。如果您的类必须持有对 Employee 的引用,请考虑将其传递给构造函数:

public Kavi ()
{
this.e = null;
}

public Kavi (Employee e)
{
this.e = e;
}

public static void main(String[] args) {

Employee e = new Kavi ();
Kavi kt=new Kavi(e);
...
}

另一种解决方案是更改:

Employee e = new Kavi();

static Employee e = new Kavi();

如果 Kavi 的所有实例共享由 e 引用的相同 Employee 实例,那将是一个有效的解决方案。

关于调用方法时出现 java.lang.StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29874322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com