我是 Java 和 OOP 的新手,这是我的问题。当我运行下面的代码时,我得到了
Exception in thread "main" java.lang.StackOverflowError.
问题出在我创建 JavaApplication1
对象的代码中。App2
类没有出现问题。如果对象 ja
是在 run 方法中创建的,则代码可以正常工作。你能解释一下为什么吗?
package javaapplication1;
public class JavaApplication1 {
int i, k, j;
class App2 {
int i = 23;
int j = 12;
}
App2 a2 = new App2();
JavaApplication1 ja = new JavaApplication1();
public void run() {
ja.i = 10;
a2.i = 26;
a2.j = 18;
System.out.println(i + "," + j + "'" + ja.i + "'"
+ a2.i + "'" + a2.j + "'" + k);
}
public static void main(String[] args) {
int k = 24;
JavaApplication1 ja1 = new JavaApplication1();
ja1.run();
ja1.i = 18;
System.out.println(ja1.i + "'" + "'" + k);
}
}
最佳答案
您的类 JavaApplication1
具有字段 JavaApplication1 ja
,它包含 JavaApplication1
类的另一个实例,该类也有自己的 ja
字段,其中包含 JavaApplication1
的另一个实例,依此类推。
换句话说,当您创建 JavaApplication1
的实例时,此实例会创建其 JavaApplication1
的内部实例,而此内部实例会创建另一个 JavaApplication1
实例,它再次创建实例 JavaApplication1
... 直到堆栈已满。
所以当你在主方法中运行这段代码时
JavaApplication1 ja1 = new JavaApplication1();
这样的事情发生了
+-----------------------------------------------+
ja1 -> | JavaApplication1 instance |
+-----------------------------------------------+
| |
| +------------------------------------+ |
| ja -> | JavaApplication1 instance | |
| +------------------------------------+ |
| | | |
| | +-------------------------+ | |
| | ja -> |JavaApplication1 instance| | |
| | +-------------------------| | |
| | | | | |
| | | ja -> .... | | |
| | +-------------------------+ | |
| +------------------------------------+ |
+-----------------------------------------------+
无论如何,我看不到 ja
字段在哪里被使用过,所以考虑从您的代码中删除它。
关于java - 在线程 "main"java.lang.StackOverflowError 中获取异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27234399/