使用对象数组时Java空指针异常

时间:2011-01-30 14:33:17

标签: java nullpointerexception

当我运行这段代码时,我得到一个空指针。其不言自明的两个类用于模拟书籍和图书馆。

如果有人能告诉我哪里出错了,我将不胜感激。

public class Library {


    private String address;
    private final static String workinghours = "9AM to 5PM";
    private Book[] bookcollection = new Book[6];
    private static int numberofbooks = 0;

    public Library(String libraryaddress) {
        address = libraryaddress;
    }

    public static void printOpeningHours() {
        System.out.println(workinghours);
    }

    public void addBook(Book newaddition) {
        bookcollection[numberofbooks] = newaddition;
        numberofbooks++;
    }

    public void printAddress() {
        System.out.println(address);
    }

    public void borrowBook(String bookname) {
        for (int i = 0; i < bookcollection.length; i++) {

            if (bookcollection[i].getTitle().equals(bookname)&&(!(bookcollection[i].isBorrowed()))) 
            {
                bookcollection[i].borrowed();
                break;
            }

        }

    }

    public void returnBook(String bookname) {
        for (int i = 0; i < bookcollection.length; i++) {

            if (bookcollection[i].getTitle().equals(bookname)) {
                bookcollection[i].returned();
                break;
            }

        }

    }

    public void printAvailableBooks() {
        for (int i = 0; i < bookcollection.length; i++) {

            if (!(bookcollection[i].isBorrowed())) {
                System.out.println(bookcollection[i].getTitle());
            }

        }

    }

    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"));

        // Print opening hours and the addresses
        System.out.println("Library hours:");
        printOpeningHours();
        System.out.println();

        System.out.println("Library addresses:");
        firstLibrary.printAddress();
        secondLibrary.printAddress();
        System.out.println();

        // Try to borrow The Lords of the Rings from both libraries
    /*  System.out.println("Borrowing The Lord of the Rings:");
        firstLibrary.borrowBook("The Lord of the Rings");
        firstLibrary.borrowBook("The Lord of the Rings");
        secondLibrary.borrowBook("The Lord of the Rings");
        System.out.println();*/

        // Print the titles of all available books from both libraries
        System.out.println("Books available in the first library:");
        firstLibrary.printAvailableBooks();
        System.out.println();
        System.out.println("Books available in the second library:");
        secondLibrary.printAvailableBooks();
        System.out.println();

        // Return The Lords of the Rings to the first library
        System.out.println("Returning The Lord of the Rings:");
        firstLibrary.returnBook("The Lord of the Rings");
        System.out.println();

        // Print the titles of available from the first library
        System.out.println("Books available in the first library:");
        firstLibrary.printAvailableBooks();
    }
}

//Library uses objects of class book as members  

public class Book {

    String title;
    boolean borrowed;

    // Creates a new Book
    public Book(String bookTitle) {

        title = bookTitle;
        borrowed = false ;
    }

    // Marks the book as rented
    public void borrowed() {

        borrowed = true;
    }

    // Marks the book as not rented
    public void returned() {

        borrowed = false;
    }

    // Returns true if the book is rented, false otherwise
    public boolean isBorrowed() {

        return ((borrowed) ? true : false);

    }

    // Returns the title of the book
    public String getTitle() {

        return 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.borrowed();
        System.out.println("Borrowed? (should be true): "
                + example.isBorrowed());
        example.returned();
        System.out.println("Borrowed? (should be false): "
                + example.isBorrowed());
    }
}

3 个答案:

答案 0 :(得分:3)

使用private Book[] bookcollection = new Book[6];创建图书数组时,数组中的每个Book最初都为null。因此,当您在不检查null的情况下遍历数组时,您将获得NullPointerException。这将发生在printAvailableBooks()

for (int i = 0; i < bookcollection.length; i++) {
    if (!(bookcollection[i].isBorrowed())) { // NPE if bookcollection[i] is null!
        ....

要解决此问题,请循环显示numberofbooks,这应与非null本书的数量相匹配。

答案 1 :(得分:2)

尝试更改所有类似

的循环
for (int i = 0; i < bookcollection.length; i++) {

for (int i = 0; i < numberofbooks; i++) {

现在,您将尝试对books-array中尚未赋值的条目(即仍包含null)执行bookcollection[i].getTitle()

答案 2 :(得分:0)

我认为必须注意的另一点是

  

NUMBEROFBOOKS

不应该是静态变量。 这是因为,它对firstLibrary和secondLibrary来说很常见。

假设您已在firstLibrary中添加了4本书,然后在secondLibrary中添加了一本书,它将存储在数组的第5位。因此,secondLibrary的前四个索引包含一个null,第五个索引包含一本书。

由此产生的另一个问题是ArrayIndexOutofBoundException。