StackOverflowError
原因 : 函數(shù)調(diào)用棧太深了,注意代碼中是否有了循環(huán)調(diào)用方法而無法退出的情況
原理
StackOverflowError 是一個(gè)java中常出現(xiàn)的錯(cuò)誤:在jvm運(yùn)行時(shí)的數(shù)據(jù)區(qū)域中有一個(gè)java虛擬機(jī)棧,當(dāng)執(zhí)行java方法時(shí)會(huì)進(jìn)行壓棧彈棧的操作。在棧中會(huì)保存局部變量,操作數(shù)棧,方法出口等等。jvm規(guī)定了棧的最大深度,當(dāng)執(zhí)行時(shí)棧的深度大于了規(guī)定的深度,就會(huì)拋出StackOverflowError錯(cuò)誤。
典型的例子:
1
2
3
4
5
6
7
8
9
10
|
public class StackOverFlowDemo { public static void Foo(){ Foo(); } public static void main(String[] args) { Foo(); } } |
今天我遇見了另外一種情況:當(dāng)兩個(gè)對(duì)象相互引用,在調(diào)用toString方法時(shí)會(huì)產(chǎn)生這個(gè)異常,因?yàn)樗鼈儠?huì)循環(huán)調(diào)用toString方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
//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)的錯(cuò)誤:
toString()
說到toString()方法,在打印一個(gè)對(duì)象時(shí),會(huì)先調(diào)用這個(gè)對(duì)象的toString()方法,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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); } } |
會(huì)輸出:
I love you.
到此這篇關(guān)于Java StackOverflowError詳解的文章就介紹到這了,更多相關(guān)Java StackOverflowError內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/gentlezuo/article/details/90580116