【问题标题】:How to resolve Stackoverflow error?如何解决 Stackoverflow 错误?
【发布时间】:2013-11-11 15:05:58
【问题描述】:

我是 java 和 bluej 的新手。现在我尝试在另一本书初始化后立即生成一本新书:

 public Book(String bookAuthor, String bookTitle)
    {
        author = bookAuthor;
        title = bookTitle;
        generatebook2();
    }
    public void generatebook2(){
        Book book2 = new Book("Jumbo","Fary");
    }

不知何故这不起作用,我得到一个错误:

 Stackoverflow error: null

我做错了什么或者我怎样才能生成一本新书?

【问题讨论】:

  • 你正在生成一本新书,正在生成一本新书,正在生成一本新书......等等等等
  • 假设这段代码运行完成,你会有多少本书?

标签: java bluej


【解决方案1】:

您正在递归调用 Book 构造函数,因此您会收到错误消息。 假设您不想从外部创建两本书,您可能可以编写一个具有不同参数的新构造函数并从第一个构造函数中使用它。

public Book(String bookAuthor, String bookTitle)
{
    author = bookAuthor;
    title = bookTitle;
    generatebook2();
}
public Book(){
}


public void generatebook2(){
    Book book2 = new Book();
    book2.setAuthor("Jumbo");
    book2.setTitle("Fary");
}

【讨论】:

  • 在调用第一本书的方法中,新建一本。
【解决方案2】:

您创建的是一个无限循环。在您的 Book 构造函数中,您正在创建一个新的 Book 对象,该对象调用该新对象的构造函数,该构造函数创建一个新的 Book 对象......等等。

如果您想在第一个对象之后立即创建另一个 Book 对象,则需要从对象外部调用它,从您最初创建图书的任何位置调用。

类似这样的:

Book book1 = new Book("John Smith", "Book1");
Book book2 = new Book("John Smith", "Book2");

并删除构造函数中的generateBook2

【讨论】:

  • 嘿,downvoter,给个解释怎么样;答案有什么问题?
【解决方案3】:

如果我们展开方法 generatebook 2,这个错误可能会更明显

public Book(String bookAuthor, String bookTitle)
    {
        author = bookAuthor;
        title = bookTitle;
        Book book2 = new Book("Jumbo","Fary"); //<-- unrolled generatebook2()
    }

每本书的构造函数,都会调用自己,看不到尽头。 book2 似乎从不做任何事情,因此该行目前没有任何影响,可以删除

【讨论】:

    【解决方案4】:

    在“Book”构造函数中,您正在调用方法“generatebook2()”。
    'generatebook2()' 方法正在调用 'Book' 构造函数。然后一次又一次地调用“generatebook2()”方法。直到你得到一个 Stackoverflow 异常(堆栈已满来自方法调用)。

    只需从构造函数中删除“generatemethod2()”调用即可。试试这个:

    public Book(String bookAuthor, String bookTitle)
    {
        author = bookAuthor;
        title = bookTitle;
    }
    
    public Book generatebook2(){
        Book book2 = new Book("Jumbo","Fary");
        return book2;
    }
    

    如果你想创建一本新书,那么你可以调用“书”类的构造函数,或者从书对象中调用方法“generatebook2()”。

    【讨论】:

    • @JohnSmith 只需从“Book”构造函数中删除“generatebook2()”调用。
    • @JohnSmith 不要让 java 创建无限数量的书籍。为什么还是用 Book 构造函数创建了一本新书?
    • 有没有可能java编译后马上生成一本新书?
    • @JohnSmith 我不明白你的问题。 “编译后”是什么意思?您的代码将仅在编译后执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2018-06-30
    • 2012-02-18
    • 2011-08-30
    相关资源
    最近更新 更多