获得stackOverflowError异常的原因是什么?

时间:2017-10-08 07:28:11

标签: java object exception

我知道这是错的,但我想知道我为什么会这样做

 class Student{

     String student;
     int rollno;

     Student stud=new Student("s",20);//(1st object)Thrown exception because of this line

     Student(String student,int rollno){
         this.student=student;
         this.rollno=rollno;
      }


    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Student stud=new Student("R",101);


    }

    }
Exception in thread "main" java.lang.StackOverflowError
at sai.Student.<init>(Student.java:8)
at sai.Student.<init>(Student.java:8).........

当我只创建一个对象(即第一个对象)时,我不会收到此错误但是当我创建两个对象时,我收到此错误。

4 个答案:

答案 0 :(得分:0)

当应用程序过度递归并且调用堆栈达到其限制时,会发生StackOverflowError。在您的情况下,创建Student的实例会初始化其所有成员,包括stud,它本身就是Student - 因此它会初始化其所有成员,包括其{{1等等,直到错误被击中。

答案 1 :(得分:0)

创建新的Student对象时,会初始化它的所有字段。 这意味着

  

弦乐学生;        int rollno;        学生学生=新学生(“s”,20岁);

一切都发生了。前两个语句是无害的,但是当执行第三个语句时,它会尝试创建一个新的Student对象,导致另一个初始化为&gt;弦乐学生;

 int rollno;
 Student stud=new Student("s",20);
     

再次导致另一个初始化,依此类推,直到你得到StackOverflow错误

答案 2 :(得分:0)

 Student stud=new Student("R",101);

1.执行第一行以上,然后执行以下行

 class Student{

 String student;
 int rollno;

 Student stud=new Student("s",20);

2.由于Student stud = new Student(“s”,20),下面的行将再次执行并且此过程继续,因为我们得到stackoverflowError异常。

班级学生{

 String student;
 int rollno;

 Student stud=new Student("s",20);

当我只创建一个对象(即第一个对象)时,我不会收到此错误但是当我创建两个对象时,我收到此错误。

** ANnswer:**因为我们没有写任何东西,所以控制不会进入第二步

答案 3 :(得分:0)

正如@Mureinik已经提到的那样,

Student stud=new Student("s",20);

上面的行是无限循环的原因,因为当你在初始化成员变量Student期间创建Student的实例时,它会进入无限循环。正如它自己创造的对象。

<强> ==被修改==

没有必要将Student类型变量声明为成员变量,我可以看到。因此,您应该从其成员变量中删除它。最终代码应该看起来像

class Student{

 String student;
 int rollno;

 Student(String student,int rollno){
     this.student=student;
     this.rollno=rollno;
  }

public static void main(String[] args) {
 Student stud1 = new Student("R",101);
 //use  stud instance

 Student stud12 = new Student("V",11); // create another instance

  }
}