当我运行这段代码时,我得到一个空指针。其不言自明的两个类用于模拟书籍和图书馆。
如果有人能告诉我哪里出错了,我将不胜感激。
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());
}
}
答案 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。