StackOverflowError
原因
根據名字的意思可以大致知道它是跟函數棧有關的錯誤,就是函數棧調用太深了,可能是代碼中有了循環調用方法而無法退出的情況。而像while這樣的死循環,不會報錯,程序會一直執行下去,占用內存。
原理
StackOverflowError 是一個java中常出現的錯誤:在jvm運行時的數據區域中有一個java虛擬機棧,當執行java方法時會進行壓棧彈棧的操作。在棧中會保存局部變量,操作數棧,方法出口等等。jvm規定了棧的最大深度,當執行時棧的深度大於了規定的深度,就會拋出StackOverflowError錯誤。
所以當你在一個函數再調用此函數時,而忘記設置出口就會出現這個錯誤。
今天我遇到的問題就是我想覆寫hash函數,想要在此函數調用的結果是原來的hash函數調用的結果再隨便加一個字符串,結果就忽視了函數會一直調用下去,相當於沒有設置遞歸函數的出口,所以導致了StackOverflowError錯誤。
這是當時我的代碼
發生的錯誤
當我把函數名字改一改就能正常運行。還有原來的一些設置圖書和學生類時,這兩個類中都覆寫了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()); } }
發生了如下錯誤