StackOverflowError
StackOverflowErrorStackOverflowError 是一个java中常出现的错误:在jvm运行时的数据区域中有一个java虚拟机栈,当执行java方法时会进行压栈弹栈的操作。在栈中会保存局部变量,操作数栈,方法出口等等。jvm规定了栈的最大深度,当执行时栈的深度大于了规定的深度,就会抛出StackOverflowError错误。典型的例子:public class ...
·
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方法
@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);
}
}
会输出:
I love you.
原文章地址: https://gentlezuo.github.io/2019/04/21/java-StackOverflowError/
点击阅读全文
更多推荐
已为社区贡献2条内容
活动日历
查看更多
直播时间 2025-01-08 16:30:00
DTT年度收官盛典:华为开发者空间大咖汇,共探云端开发创新
直播时间 2024-12-11 16:30:00
华为云数字人,助力行业数字化业务创新
直播时间 2024-11-27 16:30:00
企业数据治理一站式解决方案及应用实践
直播时间 2024-11-21 16:30:00
轻松构建AIoT智能场景应用
直播时间 2024-10-23 16:30:00
鲲鹏DevKit,助力开发者基于鲲鹏服务器实现一站式应用开发
目录
所有评论(0)