Java StackOverflowError詳解
StackOverflowError
原因 : 函數(shù)調(diào)用棧太深了,注意代碼中是否有了循環(huán)調(diào)用方法而無法退出的情況
原理
StackOverflowError 是一個java中常出現(xiàn)的錯誤:在jvm運行時的數(shù)據(jù)區(qū)域中有一個java虛擬機棧,當執(zhí)行java方法時會進行壓棧彈棧的操作。在棧中會保存局部變量,操作數(shù)棧,方法出口等等。jvm規(guī)定了棧的最大深度,當執(zhí)行時棧的深度大于了規(guī)定的深度,就會拋出StackOverflowError錯誤。
典型的例子:
public class StackOverFlowDemo {
public static void Foo(){
Foo();
}
public static void main(String[] args) {
Foo();
}
}
今天我遇見了另外一種情況:當兩個對象相互引用,在調(diào)用toString方法時會產(chǎn)生這個異常,因為它們會循環(huán)調(diào)用toString方法。
//book和student相互循環(huán)引用
public class StackOverFlowDemo {
static class Student{
String name;
Book book;
public Student(String name) {
this.name = name;
}
//循環(huán)調(diào)用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());
}
}
出現(xiàn)的錯誤:

toString()
說到toString()方法,在打印一個對象時,會先調(diào)用這個對象的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.
到此這篇關(guān)于Java StackOverflowError詳解的文章就介紹到這了,更多相關(guān)Java StackOverflowError內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何用Java實現(xiàn).env文件讀取敏感數(shù)據(jù)
這篇文章主要介紹了如何用Java實現(xiàn).env文件讀取敏感數(shù)據(jù),并提供了一個自動配置類EnvAutoConfiguration,common-env-starter-demo模塊展示了如何配置和啟動一個簡單的Spring Boot應用程序,需要的朋友可以參考下2025-02-02
Spring在多線程下保持事務的一致性的方法實現(xiàn)
當Spring在多線程環(huán)境下運行時,確保事務一致性是非常重要的,本文主要介紹了Spring在多線程下保持事務的一致性的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧2024-01-01
使用SpringCache操作Redis緩存數(shù)據(jù)的示例代碼
SpringCache是一個框架,實現(xiàn)了基于注解的緩存功能,只需要簡單的加一個注解,就能實現(xiàn)緩存功能,本文給大家介紹了如何使用SpringCache操作Redis緩存數(shù)據(jù),文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-01-01

