必威体育Betway必威体育官网
当前位置:首页 > IT技术

StackOverflowError

时间:2019-08-08 06:42:08来源:IT技术作者:seo实验室小编阅读:87次「手机版」
 

stackoverflowerror

StackOverflowERROR

原因 : 函数调用栈太深了,注意代码中是否有了循环调用方法而无法退出的情况

原理

stackoverflowerror 是一个java中常出现的错误:在jvm运行时的数据区域中有一个java虚拟机栈,当执行java方法时会进行压栈弹栈的操作。在栈中会保存局部变量,操作数栈,方法出口等等。jvm规定了栈的最大深度,当执行时栈的深度大于了规定的深度,就会抛出StackOverflowError错误。

典型的例子:


public class StackOverFlowDemo {

    public static void Foo(){
        Foo();
    }

    public static void main(String[] args) {
        Foo();
    }
}

今天我遇见了另外一种情况:当两个对象相互引用,在调用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());
    }

}

出现的错误:

stackoverflow

toString()

说到toString()方法,在打印一个对象时,会先调用这个对象的toString()方法,例如:

ublic 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.

文章地址: https://gentlezuo.github.io/2019/04/21/java-StackOverflowError/

相关阅读

idea编译StackOverflowError问题

Error:scalac: while compiling: E:\XXXXXXXXX.scaladuring phase: erasurelibrary version: version 2.10.4compiler version:

分享到:

栏目导航

推荐阅读

热门阅读