JAVA中StackOverflowError


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());
    }

}

發生了如下錯誤

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM