Java 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{String name;Book book;public Student(String name) { this.name = name;}//循环调用toString方法@Overridepublic 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;}@Overridepublic 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()方法,例如:
public class toStringDemo { static class A{@Overridepublic String toString() { System.out.print('I '); return '';} } public static void main(String[] args) {A a=new A();System.out.println('love you.'+a); }}
会输出:
I love you.
到此这篇关于Java StackOverflowError详解的文章就介绍到这了,更多相关Java StackOverflowError内容请搜索好吧啦网以前的文章或继续浏览下面的相关文章希望大家以后多多支持好吧啦网!
相关文章:
1. PHP设计模式之迭代器模式浅析2. JS实现手写 forEach算法示例3. JXTA Java标准版本 2.3.7 发布4. Spring FreeMarker整合Struts2过程详解5. 用css截取字符的几种方法详解(css排版隐藏溢出文本)6. Vue axios与Go Frame后端框架的Options请求跨域问题详解7. Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)8. ASP.NET MVC使用正则表达式验证手机号码9. python b站视频下载的五种版本10. Android Studio3.6新特性之视图绑定ViewBinding使用指南

网公网安备