我是Java的新手,我正在尝试一些例子来了解它是如何工作的。
我在理解以下代码失败的原因时遇到了问题。我知道导致错误的行,但我不知道为什么。我创建了两个类Class1
和Main
,其代码用两个单独的.java文件编写:
public class Class1
{
int var;
public void method1 ()
{
System.out.println(var);
}
Class1 obj1 = new Class1(); // this is the line that causes the error
}
和
public class Main
{
public static void main (String[] args)
{
Class1 obj = new Class1();
obj.method1();
}
}
它编译得很好,但是当我运行java Main
时,它只打印数百次错误
at Class1.<init>(Class1.java:8)
我尝试运行java Main | more
(我正在使用Unix Bash)但管道被忽略了,我看不到错误消息的第一行。 java Main > log.txt
输出重定向到文本文件也不起作用。如果我删除该行,即如果我没有在Class1
类主体中创建obj1
对象Class1
,则一切正常。任何人都可以向我解释这条线有什么问题吗?
谢谢
答案 0 :(得分:3)
我认为你有一个递归Object
初始化。
Class1 obj = new Class1();
是一个实例语句,因此在每个实例中都会以递归方式从main
方法启动它。
这将导致StackOverflowError
。
StackOverflowError
是JVM告诉你溢出堆栈内存的方式,触发一个内存的最简单方法是通过无限方法或构造函数递归,例如在你的情况下。
答案 1 :(得分:1)
在同一个班级
进行Class1 obj1 = new Class1();
这是违法的
你不应该在同一个类的类级别创建对象。允许在同一个类的类级别创建像Class1 obj1;
这样的引用
答案 2 :(得分:1)
那实际上是一个无限循环,你在类的每个新实例中创建一个类的新实例,最终Java耗尽内存或堆栈并引发异常。
答案 3 :(得分:1)
你的代码最终会抛出:
java.lang.StackOverflowError
由于无条件的递归初始化尝试。
要完成类构建,需要完成此初始化:
Class1 obj1 = new Class1();
反过来又会尝试再次构建Class1
,这个活跃的循环将持续到JVM放弃 java.lang.StackOverflowError
。
答案 4 :(得分:1)
问题是你是在无限循环中创建Class1对象。
在main方法中创建Class1对象时,它会初始化您在Class1主体中定义的所有变量。但是由于你还在Class1体内创建了一个新的Class1对象,它会不断创建Class1对象,并且在某些时候会导致堆栈溢出错误。