Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使对象在main方法外部但在类内部,从而产生异常_Java - Fatal编程技术网

Java 使对象在main方法外部但在类内部,从而产生异常

Java 使对象在main方法外部但在类内部,从而产生异常,java,Java,我的班级: public class Test { Test(){ System.out.println("Hello World"); } public void doSomething() { System.out.println("Do something"); } Test t = new Test(); //why its is ok, although it

我的班级:

public class Test {

    Test(){
        System.out.println("Hello World");
    }
    
    public void doSomething() {
        System.out.println("Do something");
    }

    Test t = new Test(); //why its is ok, although it gives run time stack overflow exception 
    
    public static void main(String[] args) {
        Test t = new Test();
        t.doSomething();
    }
}

这是个例外,有人能告诉我为什么吗?因为当我们在main方法之外创建对象时没有编译错误,但是当我们运行程序时,它给出了错误,为什么?

它给出了
stackoverflowerrror
,因为您在初始化自己的初始化块内的类的实例。因此,当这个类被初始化为运行时,它会运行它的初始化块,这会创建它自己的一个新实例,并再次运行它的初始化块,这个过程会无限期地重复一次又一次。一旦调用堆栈的限制通过一次又一次调用初始化块而超出,当您在其内部创建时,程序将在infinte循环中发出
StackOverflowerError
Its

public class Test {

public Test(){
    System.out.println("Hello World");
}

public void doSomething() {
    System.out.println("Do something");
}

public static void main(String[] args) {
Test t = new Test();
t.doSomething();
}

}

@公平地说,给出的示例是一个最小的可复制示例。它是一个自包含的类,有一个main方法,您可以运行并重现错误(不必运行它,错误是什么是显而易见的)。你还想要什么?问问自己:当你调用
newtest()时会发生什么?@k314159 well Stackoverflow是关于记录问题的。因此,我们应该尽可能地遵循一些准则。即使问题很简单。@k314159由于格式错误,我真的忽略了“整个类”。但请注意,“某些异常”仍然不是堆栈跟踪。我同意,细节在那里,但是一个不能识别的mcve…@paankayj Your
t
(方法体之外的那个)是一个实例变量(也称为实例成员或实例字段)。赋值运算符(
=
)后面的表达式是一个初始值设定项,它给出
t
一个值。此初始值设定项在构造函数体执行之前触发,也就是说,它与
Test(){This.t=new Test();}
相同。现在情况变得更加明显了,正如奥萨马在他的回答中所解释的那样。