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 Yourt
(方法体之外的那个)是一个实例变量(也称为实例成员或实例字段)。赋值运算符(=
)后面的表达式是一个初始值设定项,它给出t
一个值。此初始值设定项在构造函数体执行之前触发,也就是说,它与Test(){This.t=new Test();}
相同。现在情况变得更加明显了,正如奥萨马在他的回答中所解释的那样。