Java:对象创建导致运行时错误

时间:2013-10-01 10:16:10

标签: java object runtime-error

我是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,则一切正常。任何人都可以向我解释这条线有什么问题吗?

谢谢

5 个答案:

答案 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对象,并且在某些时候会导致堆栈溢出错误。