所以我一直在尝试运行我的LibraryTest.java程序,但是当它必须使用sortBooksByTitle()和sortBooksByNumPages()时它会崩溃。这两个排序方法编译,但是当我尝试运行测试类时,它会崩溃。 这些是我的三个java文件。
Book.java
public class Book {
private String author;
private String title;
private int numPages;
public Book() {
title = "EMPTY";
}
public Book(String titleIn, String authorIn, int numPagesIn) {
title = titleIn;
author = authorIn;
numPages = numPagesIn;
}
public String getAuthor() {
return author;
}
public String getTitle() {
return title;
}
public int getNumPages() {
return numPages;
}
public String toString() {
return title + " by " + author + " (" + numPages + " pages)";
}
}
Library.java
import java.util.Random;
import java.util.Arrays;
public class Library {
private Book[] array;
private int count;
private Random randomBook = new Random();
public Library(int numBooks) {
array = new Book[numBooks];
count = 0;
}
public int getCount() {
return count;
}
public void addBook(Book b) {
//check if program can add new book
if (count < array.length) {
array[count] = b;
count++;
} //if array is full, a message is thrown
else {
System.out.println("The Library is full!");
}
}
//Adds content of a library to another library.
public void addLibrary(Library l) {
for (Book b : l.array) {
addBook(b);
}
}
//Returns a book after receiving a String input.
public Book getBook(String book) {
for (int i = 0; i < array.length - 1; i++) {
String titleBook = array[i].getTitle();
if (titleBook.equals(book)) {
return array[i];
}
}
Book newBook = new Book();
return newBook;
}
//Returns the book located in the array index given by the input.
public Book getBook(int index) {
if (index < array.length) {
System.out.printf("num: %d", index);
return array[index - 1];
}
Book newBook = new Book();
return newBook;
}
//Uses the random number generator and returns a book located in the array which
//index is the random number obtained.
public Book getBook() {
int num = randomBook.nextInt(array.length);
//System.out.printf("random num: %d", num);
return array[num];
}
//Sorts books alphabetically.
public void sortBooksByNumPages() {
for (int i = 0; i < array.length - 1; i++) {
for (int j = i + 1; j < array.length; j++) {
if (array[i].getNumPages() > array[j].getNumPages()) {
Book temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
}
//Sorts books by number of pages in ascending order.
public void sortBooksByTitle() {
for (int i = 0; i < array.length - 1; i++) {
for (int n = i; n < array.length; n++) {
if (array[n].getTitle().compareToIgnoreCase(array[i].getTitle()) < 0) {
Book temp = array[i];
array[i] = array[n];
array[n] = temp;
}
}
}
}
//Output each book's information.
public String toString() {
String s = "Number of books: " + count + "\n";
for (int i = 0; i < array.length; i++) {
s = s + array[i] + "\n";
}
return s;
}
}
LibraryTest.java
public class LibraryTest {
public static void main(String args[]) {
Library lib = new Library(3);
Book b1 = new Book("Java: How to Program", "Deitel and Deitel", 1496);
lib.addBook(b1);
Book b2 = new Book("A Brief History of Time", "Stephen Hawking", 212);
lib.addBook(b2);
Book b3 = new Book("The Art of War", "Sun Tzu", 384);
lib.addBook(b3);
Book b4 = new Book("Ender's Game", "Orson Scott Card", 352);
// This addBook call should fail since the Library lib is full
lib.addBook(b4);
Book b5 = new Book("The Singularity is Near", "Ray Kurzweil", 672);
Library lib2 = new Library(10);
lib2.addBook(b4);
lib2.addBook(b5);
System.out.print("\n\nOriginal library contents\n");
// This should display that there are 3 books in the library & info
System.out.print(lib);
System.out.print("\n\nAfter combining libraries\n");
lib2.addLibrary(lib);
lib = lib2;
// This should display that there are 5 books in the library & info
System.out.print(lib);
System.out.print("\n\nSorted by title\n");
try {
lib.sortBooksByTitle();
} catch (Exception e) {
System.out.println(e.toString());
System.out.println(e.getMessage());
}
// This should display the books in alphabetical order by title
System.out.print(lib);
/*
* System.out.print("\n\nSorted by number of pages\n");
* lib.sortBooksByNumPages(); // This should display the books in
* increasing order of the number of //pages each one has
* System.out.print(lib);
*/
// This should display Ender's Game
System.out.print("\n\nBook 2:\n" + lib.getBook(1));
// This should display the EMPTY book
System.out.print("\n\nBook 20:\n" + lib.getBook(20));
System.out.print("\n\nBook 'The Art of War':\n"
+ lib.getBook("The Art of War"));
// This should randomly display a book from the library (potentially
//different each time)
System.out.print("\n\nRandom book:\n" + lib.getBook());
}
}
再次,3个文件编译得很好,但是当我尝试运行时崩溃。请帮帮我。谢谢。
答案 0 :(得分:2)
问题是NullPointerException
方法中出现了sortBooksByTitle()
。抛出异常的特定行是
if (array[n].getTitle().compareToIgnoreCase(array[i].getTitle()) < 0).
这种情况正在发生,因为当您创建lib2
时,通过调用new Library(10)
来执行此操作,这会导致它将其数组初始化为大小为10.在调用sortBooksByTitle()
时,数组包含5书籍和5 null
个值。一旦循环完成了5本书,它就会点击null
并在其上调用getTitle()
,这会产生您的NPE。