java - 排序方法运行时崩溃

标签 java sorting

所以我一直在尝试运行我的 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)";
    }
}

库.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 个文件再次编译得很好,但当我尝试运行时崩溃了。请帮帮我。谢谢。

最佳答案

问题是 NullPointerException扔进你的sortBooksByTitle()方法。抛出异常的具体行是 if (array[n].getTitle().compareToIgnoreCase(array[i].getTitle()) < 0).

发生这种情况是因为当您创建 lib2 时您可以调用 new Library(10) 来完成此操作这会导致它将数组初始化为大小 10。在调用 sortBooksByTitle() 时该数组包含 5 本书和 5 null值(value)观。一旦循环遍历完 5 本书,它就会到达 null。并调用getTitle()就可以了,这会导致你的 NPE。

关于java - 排序方法运行时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12541300/

相关文章:

JavaScript:在多选中对选项进行排序时忽略大小写

python - 如何按字典键内的值对字典进行排序?

java - 将函数的前 2 个参数之外的所有参数传递给另一个函数

java - 使用 Python 模块的 POST 请求

java - 我应该使用什么 html 解析器?

python - 在排序时访问列表

java - 向 TableColumn 添加自定义排序算法

mongodb - 根据 Go 子文档中的字段对 mongodb 查询进行排序

java - 是否可以在外部分析器下运行 JMH 基准测试?

java - 我的数据库时间戳字段会自动转换为 GUI 用户的时区吗