0

我是 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

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

4

4 回答 4

2

您正在递归调用 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");
}
于 2013-11-11T15:07:25.993 回答
1

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

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

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

于 2013-11-11T15:12:48.857 回答
1

您创建的是一个无限循环。在您的Book构造函数中,您正在创建一个新Book对象,该对象调用该新对象的构造函数,该构造函数创建一个新Book对象……依此类推。

如果你想Book在第一个对象之后立即创建另一个对象,你需要从对象外部调用它,从你首先创建这本书的地方调用。

像这样的东西:

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

并删除generateBook2构造函数中的。

于 2013-11-11T15:13:03.300 回答
0

在“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()”。

于 2013-11-11T15:08:43.063 回答