Java StackOverflowError詳解
StackOverflowError
原因 : 函數(shù)調(diào)用棧太深了,注意代碼中是否有了循環(huán)調(diào)用方法而無法退出的情況
原理
StackOverflowError 是一個java中常出現(xiàn)的錯誤:在jvm運(yùn)行時的數(shù)據(jù)區(qū)域中有一個java虛擬機(jī)棧,當(dāng)執(zhí)行java方法時會進(jìn)行壓棧彈棧的操作。在棧中會保存局部變量,操作數(shù)棧,方法出口等等。jvm規(guī)定了棧的最大深度,當(dāng)執(zhí)行時棧的深度大于了規(guī)定的深度,就會拋出StackOverflowError錯誤。
典型的例子:
public class StackOverFlowDemo {
public static void Foo(){
Foo();
}
public static void main(String[] args) {
Foo();
}
}
今天我遇見了另外一種情況:當(dāng)兩個對象相互引用,在調(diào)用toString方法時會產(chǎn)生這個異常,因?yàn)樗鼈儠h(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實(shí)現(xiàn).env文件讀取敏感數(shù)據(jù)
這篇文章主要介紹了如何用Java實(shí)現(xiàn).env文件讀取敏感數(shù)據(jù),并提供了一個自動配置類EnvAutoConfiguration,common-env-starter-demo模塊展示了如何配置和啟動一個簡單的Spring Boot應(yīng)用程序,需要的朋友可以參考下2025-02-02
Java實(shí)現(xiàn)線程同步的四種方式總結(jié)
Java線程同步屬于Java多線程與并發(fā)編程的核心點(diǎn),需要重點(diǎn)掌握,下面我就來詳解Java線程同步的4種主要的實(shí)現(xiàn)方式,需要的可以參考一下2022-09-09
Spring在多線程下保持事務(wù)的一致性的方法實(shí)現(xiàn)
當(dāng)Spring在多線程環(huán)境下運(yùn)行時,確保事務(wù)一致性是非常重要的,本文主要介紹了Spring在多線程下保持事務(wù)的一致性的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01
Java實(shí)現(xiàn)的計(jì)算稀疏矩陣余弦相似度示例
這篇文章主要介紹了Java實(shí)現(xiàn)的計(jì)算稀疏矩陣余弦相似度功能,涉及java基于HashMap的數(shù)值計(jì)算相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
使用SpringCache操作Redis緩存數(shù)據(jù)的示例代碼
SpringCache是一個框架,實(shí)現(xiàn)了基于注解的緩存功能,只需要簡單的加一個注解,就能實(shí)現(xiàn)緩存功能,本文給大家介紹了如何使用SpringCache操作Redis緩存數(shù)據(jù),文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-01-01
maven實(shí)現(xiàn)docker自動化部署插件的使用
本文主要介紹了maven實(shí)現(xiàn)docker自動化部署插件的使用,分享給大家,感興趣的小伙伴們可以參考一下2021-06-06

