请考虑以下代码。
public class Skyler {
Skyler s1=new Skyler();
public static void main(String asd[]){
Skyler s2=new Skyler();
}
}
它生成java.lang.StackOverflowError
例外。为什么呢?
请考虑以下代码。
public class Skyler {
Skyler s1=new Skyler();
static Skyler s2=new Skyler();
Skyler(){
System.out.println("const");
}
public static void main(String sdp[]){}
}
这也会产生相同的java.lang.StackOverflowError
异常。为什么呢?
两种例外的理由是否相同?
答案 0 :(得分:3)
你经历了一个循环,其中构造函数将其自行调用为servaral次,直到它溢出为止。
例如:
原因在两种情况都是一样的。它无休止地称之为自我。
在这两种情况下,只有一次区别是你提供了一个带有print语句的默认no org构造函数,这样你才能看到print语句,直到你得到错误。
答案 1 :(得分:2)
每次创建Skyler
的实例时,都会初始化该实例的s1
成员,这将创建另一个Skyler
实例,该实例初始化s1
成员另一个实例,它创建了Skyler
的另一个实例,依此类推......
换句话说,您对Skyler
构造函数有无限的调用链,导致StackOverflowErr
。
答案 2 :(得分:1)
删除Skyler s1=new Skyler();
。使用您的代码,Skyler类有一个类型为Skyler的变量,然后它会一次又一次地创建一个Skyler,因此StackOverflowException
存在。
答案 3 :(得分:1)
检查逻辑,你创建一个新的Skyler
,这是做什么的?它创建了一个新的Skyler
,令人惊讶的是,这个新Skyler
创建了另一个新的Skyler
。这一切都来自您的行Skyler s1=new Skyler();
(非静态的),它会递归地创建对象Skyler
的endles实例。
答案 4 :(得分:1)
Skyler类调用自己的构造函数。因此,在创建Skyler的实例时,会创建另一个Skyler实例,依此类推......结果是StackOverflow。