我是Java和OOP的新手,这是我的问题。当我运行以下代码时,我得到了
线程中的异常" main" java.lang.StackOverflowError的。
问题出在代码中,我创建了一个JavaApplication1
的对象。问题是App2
类没有发生。如果在run方法中创建了对象ja
,则代码可以正常工作。你能解释一下为什么吗?
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);
}
}
答案 0 :(得分:2)
我认为您最终会一直创建导致stackOverflow异常的JavaApplication1对象。您应该删除带注释的行。
App2 a2 = new App2();
JavaApplication1 ja =new JavaApplication1(); //why do you need this?
public void run(){
答案 1 :(得分:2)
您的班级JavaApplication1
包含字段JavaApplication1 ja
,其中包含JavaApplication1
类的另一个实例,该实例还有自己的ja
字段,其中包含另一个JavaApplication1
实例等等等等。
换句话说,当您创建JavaApplication1
实例时,此实例会创建其JavaApplication1
的内部实例,并且此内部实例会创建另一个JavaApplication1
实例,该实例将再次创建实例{{1} } ...直到堆栈满了。
所以当你在main方法中运行这段代码时
JavaApplication1
这样的事情发生了
JavaApplication1 ja1 = new JavaApplication1();
无论如何,我都没有看到 +-----------------------------------------------+
ja1 -> | JavaApplication1 instance |
+-----------------------------------------------+
| |
| +------------------------------------+ |
| ja -> | JavaApplication1 instance | |
| +------------------------------------+ |
| | | |
| | +-------------------------+ | |
| | ja -> |JavaApplication1 instance| | |
| | +-------------------------| | |
| | | | | |
| | | ja -> .... | | |
| | +-------------------------+ | |
| +------------------------------------+ |
+-----------------------------------------------+
字段的使用位置,因此请考虑将其从代码中删除。
答案 2 :(得分:1)
问题是你不能这样做:
Class Try{
Try try = new Try();
public static void main(String[] arg)
{
Try try1 = new Try();
}
上面代码的问题是首先执行将从你的main方法开始(当然在这种特殊情况下:))然后将创建try1对象并且所有的Class字段都将被初始化,因为你创建了一个对象你在同一个类中作为一个类Field()它会尝试重新初始化Class字段,最终形成一个无限循环,并且不可避免地会出现Famous STACK OVERFLOW错误!
现在,谈谈你的问题:
App2 a2 = new App2();
JavaApplication1 ja =new JavaApplication1(); //remove this line, it is causing the SO-error!!!
答案 3 :(得分:1)
您的班级JavaApplication1
已成员JavaApplication1 ja
已就位初始化。这意味着当您在JavaApplication1
方法中创建main()
的新实例时,您将再次调用隐式默认构造函数,再次调用new JavaApplication1()
。
如果您希望代码正常工作,请先删除
行JavaApplication1 ja =new JavaApplication1();