-1

我是 Java 新手,我正在尝试一些示例来了解它是如何工作的。

我无法理解以下代码失败的原因。我知道导致错误的行,但我不知道为什么。我创建了两个类Class1Main,它们的代码写在两个单独的 .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谁能向我解释那条线有什么问题?

谢谢

4

5 回答 5

3

我认为你有一个递归Object初始化。

Class1 obj = new Class1();是一个实例语句,因此它会在每个实例中递归调用,从您的main方法启动。

这将导致StackOverflowError.

StackOverflowError是 JVM 告诉您堆栈内存溢出的方式,最简单的触发方式是通过无限方法或构造函数递归,例如在您的情况下。

于 2013-10-01T10:18:51.093 回答
1

Class1 obj1 = new Class1();在同一班级的班级级别上这样做是非法 的

你不应该在同一个类的类级别创建对象。它允许在 Class1 obj1;同一个类的类级别创建引用

于 2013-10-01T10:17:29.120 回答
1

这实际上是一个无限循环,因为您在类的每个新实例中创建一个新的类实例,最终 Java 耗尽内存或堆栈并引发异常。

于 2013-10-01T10:20:38.910 回答
1

您的代码最终会抛出:

java.lang.StackOverflowError

因为无条件递归初始化尝试。

要完成类构造,它需要完成这个初始化:

Class1 obj1 = new Class1(); 

这反过来又会尝试Class1再次构建,这个活跃的循环将一直持续到 JVM 放弃java.lang.StackOverflowError.

于 2013-10-01T10:21:09.897 回答
1

问题是您正在无限循环中创建 Class1 对象。

当您在 main 方法中创建 Class1 对象时,它会初始化您在 Class1 主体中定义的所有变量。但是由于您还在 Class1 主体内创建了一个新的 Class1 对象,它会不断创建 Class1 对象,并且在某些时候,它会导致堆栈溢出错误。

于 2013-10-01T10:22:35.657 回答