2015-09-20 2 views
1

Я разрабатываю программу управления библиотекой (это назначение из онлайн-курса), и я не могу решить ошибку nullpointerexception во время выполнения.Java beginner: nullpointerexception error

Это программа до сих пор:

//file Library.java 
public class Library { 

String address; 
Book[] collection; 
int collectionCounter = 0; 

    // Add the missing implementation to this class 
    public static void main(String[] args) 
    { 
     // Create two libraries 
     Library firstLibrary = new Library("10 Main St."); 
     Library secondLibrary = new Library("228 Liberty St."); 
     // Add four books to the first library 
     firstLibrary.addBook(new Book("The Da Vinci Code")); 
     firstLibrary.addBook(new Book("Le Petit Prince")); 
     firstLibrary.addBook(new Book("A Tale of Two Cities")); 
     firstLibrary.addBook(new Book("The Lord of the Rings")); 
    } 

    //Constructor 
    public Library(String libraryName) 
    { 
     address = libraryName; 
     collectionCounter = 0; 
    } 

    //Methods 
    public void addBook(Book newBook) 
    { 
     System.out.println(this.collectionCounter); 
     this.collection[this.collectionCounter] = newBook; 
     this.collectionCounter += 1; 
    } 

А другой файл .java, для Book класса:

public class Book { 
String title; 
boolean borrowed; 

    // Creates a new Book 
    public Book(String bookTitle) { 
     // Implement this method 
     title = bookTitle; 
     borrowed = false; 
    } 
    // Marks the book as rented 
    public void rented() { 
     // Implement this method 
     this.borrowed = true; 
    } 

    // Marks the book as not rented 
    public void returned() { 
     // Implement this method 
     this.borrowed = false; 
    } 

    // Returns true if the book is rented, false otherwise 
    public boolean isBorrowed() { 
     // Implement this method 
     return this.borrowed; 
    } 

    // Returns the title of the book 
    public String getTitle() { 
     return this.title; 
    } 

    public static void main(String[] arguments) { 

     // Small test of the Book class 
     Book example = new Book("The Da Vinci Code"); 
     System.out.println("Title (should be The Da Vinci Code): " + example.getTitle()); 
     System.out.println("Borrowed? (should be false): " + example.isBorrowed()); 
     example.rented(); 
     System.out.println("Borrowed? (should be true): " + example.isBorrowed()); 
     example.returned(); 
     System.out.println("Borrowed? (should be false): " + example.isBorrowed()); 
    } 

}

Это выход программы:

0 
Exception in thread "main" java.lang.NullPointerException 
    at Library.addBook(Library.java:59) 
    at Library.main(Library.java:14) 

Я понимаю, что ошибка вызвана массивом книг, но я действительно не знаю, что делать, я никогда не видел экземпляр объекта в качестве аргумента для метода. Заранее спасибо!

ответ

5

Вы должны создать свой массив collection, чтобы иметь возможность поместить в него что-либо. Заменить

Book[] collection; 

по

Book[] collection = new Book[BOOK_COLLECTION_SIZE]; 

с BOOK_COLLECTION_SIZE быть достаточно большое количество.

Еще лучше, используйте вместо массива List. Таким образом, вы не должны будете угадать размер библиотеки заранее:

List<Book> collection = new LinkedList<Book>(); 

Тогда addBook может выглядеть следующим образом:

public void addBook(Book newBook) 
{ 
    this.collection.add(newBook); 
} 

и вы можете избавиться от collectionCounter. Если вам действительно нужно количество книг, вы можете получить его, используя this.collection.size().

+1

Когда люди отправляют ответ на одну секунду, прежде чем ... именно то, что я собирался сказать XD (кроме этого я не понимаю, почему вы должны использовать 'LinkedList' здесь вместо' ArrayList') , – bcsb1001

+1

Ударьте меня на это :) –

+0

Эй, спасибо за ответ, когда вы говорите, что 'addBook' может выглядеть как эти четыре строки кода, вы имеете в виду, что я выбираю подход с привязанным списком или он работает с подход массива тоже? – Frank

3

Проблема заключается в вашем классе Library. Это addBook способ использует this.collection, однако это было только заявлено, отсюда все еще есть null.

public void addBook(Book newBook) 
{ 
    System.out.println(this.collectionCounter); 
    this.collection[this.collectionCounter] = newBook; 
    this.collectionCounter += 1; 
}