Java StackOverflowError详解

网友投稿 508 2022-10-05


Java StackOverflowError详解

StackOverflowError

原因 : 函数调用栈太深了,注意代码中是否有了循环调用方法而无法退出的情况

原理

StackOverflowError 是一个java中常出现的错误:在jvm运行时的数据区域中有一个java虚拟机栈,当执行java方法时会进行压栈弹栈的操作。在栈中会保存局部变量,操作数栈,方法出口等等。jvm规定了栈的最大深度,当执行时栈的深度大于了规定的深度,就会抛出StackOverflowError错误。

典型的例子:

public class StackOverFlowDemo {

public static void Foo(){

Foo();

}

public static void main(String[] args) {

Foo();

}

}

今天我遇见了另外一种情况:当两个对象相互引用,在调用toString方法时会产生这个异常,因为它们会循环调用toString方法。

//book和student相互循环引用

public class StackOverFlowDemo {

static class Student{nenhGfo

String name;

Book book;

public Student(String name) {

this.name = name;

}

//循环调用toString方法

@Override

public String toString() {

return "Student{" +

"name='" + name + '\'' +

", book=" + book +

'}';

}

}

static class Book {

String isbn;

Student student;

public Book(String isbn, Student student) {

this.isbn = isbn;

this.student = student;

}

@Override

public String toString() {

return "Book{" +

"isbn='" + isbn + '\'' +

", student=" + student +

'}';

}

}

public static void main(String[] args) {

Student student=new Student("zhang3");

Book book=new Book("1111",student);

student.book=book;

System.out.println(book.toString());

}

}

出现的错误:

toString()

说到toString()方法,在打印一个对象时,会先调用这个对象的toString()方法,例如:

public class toStringDemo {

static class A{

@Override

public String toString() {

System.out.print("I ");

return "";

}

}

public static void main(String[] args) {

A a=new A();

System.out.println("love you."+a);

nenhGfo }

}

会输出:

I love you.


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:同态加密实现数据隐私计算,能让你的小秘密更加秘密(动态加密解密算法)
下一篇:网络安全和Web安全是一回事吗?(网络安全和web安全的区别)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~