java.lang.StackOverflowError 调用方法时
java.lang.StackOverflowError while calling a method
我正在学习界面行为。我已经创建了一个接口及其实现者 class,在调用方法 m1() 时我得到了 java.lang.WhosebugError。我不知道为什么。谁能告诉我这背后的正当理由!!!!!!
这是代码:
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.WhosebugError
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
构造函数的无限调用链。因此 WhosebugError。
相当于:
Employee e;
public Kavi ()
{
e = new Kavi();
}
构造函数不应在无限循环中调用自身。
删除 Employee e = new Kavi()
行将解决您的问题。如果您的 class 必须包含对 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
实例,那将是一个有效的解决方案。
在您的 class Kavi
中,您正在声明一个 e
类型 Employee
的字段并使用新的 Kavi
对象对其进行初始化。
当创建 class Kavi 的第一个实例时,您将触发上述初始化并创建一个新的 Kavi
对象(第 2 行),该对象还会创建一个新的 Kavi
等等等等。所以有问题的行是
Employee e= new Kavi();
在创建了大量 Kavi
个对象后,堆栈将达到其限制并抛出异常。
我正在学习界面行为。我已经创建了一个接口及其实现者 class,在调用方法 m1() 时我得到了 java.lang.WhosebugError。我不知道为什么。谁能告诉我这背后的正当理由!!!!!! 这是代码:
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.WhosebugError
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
构造函数的无限调用链。因此 WhosebugError。
相当于:
Employee e;
public Kavi ()
{
e = new Kavi();
}
构造函数不应在无限循环中调用自身。
删除 Employee e = new Kavi()
行将解决您的问题。如果您的 class 必须包含对 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
实例,那将是一个有效的解决方案。
在您的 class Kavi
中,您正在声明一个 e
类型 Employee
的字段并使用新的 Kavi
对象对其进行初始化。
当创建 class Kavi 的第一个实例时,您将触发上述初始化并创建一个新的 Kavi
对象(第 2 行),该对象还会创建一个新的 Kavi
等等等等。所以有问题的行是
Employee e= new Kavi();
在创建了大量 Kavi
个对象后,堆栈将达到其限制并抛出异常。