在线程“main”中获取exceptionjava.lang.StackOverflowError

我是Java和OOP的新手,这是我的问题。 当我运行以下代码时,我得到了

线程“main”java.lang.StackOverflowError中的exception。

我在代码中遇到的问题是我创建了一个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); } } 

您的类JavaApplication1具有字段JavaApplication1 ja ,它包含另一个JavaApplication1类实例,该实例也有自己的ja字段,该字段包含另一个JavaApplication1实例,依此类推。

换句话说,当您创建JavaApplication1实例时,此实例会创建其JavaApplication1内部实例,并且此内部实例会创建另一个JavaApplication1实例,该实例再次创建实例JavaApplication1 …直到堆栈已满。

因此,当您在main方法中运行此代码时

 JavaApplication1 ja1 = new JavaApplication1(); 

这样的事情发生了

  +-----------------------------------------------+ ja1 -> | JavaApplication1 instance | +-----------------------------------------------+ | | | +------------------------------------+ | | ja -> | JavaApplication1 instance | | | +------------------------------------+ | | | | | | | +-------------------------+ | | | | ja -> |JavaApplication1 instance| | | | | +-------------------------| | | | | | | | | | | | ja -> .... | | | | | +-------------------------+ | | | +------------------------------------+ | +-----------------------------------------------+ 

无论如何,我没有看到ja字段曾被使用过,所以请考虑从代码中删除它。

我认为你最终会一直创建JavaApplication1对象,这会导致stackOverflowexception。 您应该删除带注释的行。

  App2 a2 = new App2(); JavaApplication1 ja =new JavaApplication1(); //why do you need this? public void run(){ 

问题是你不能做这样的事情:

 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!!! 

您的类JavaApplication1具有就地初始化的成员JavaApplication1 ja 。 这意味着当您在main()方法中创建JavaApplication1新实例时,您将再次调用隐式默认构造函数,该构造函数再次调用new JavaApplication1()

如果您希望代码正常工作,请首先删除行

 JavaApplication1 ja =new JavaApplication1();