我的类中的removeListing()方法抛出空指针异常

时间:2018-04-02 06:12:36

标签: java arrays exception nullpointerexception

这是我的库类,它创建了一个名为“列表”的类型的“库”。我试图创建一个removeListing()函数,但是当我在我的数组命名列表上调用它时,我在removeListing()方法的第一个if语句中得到一个空指针异常。

我检查了另一个关于nullpointerexception是什么的问题,但我仍然不确定为什么我的特定if语句抛出一个。谢谢你的帮助!

class Library {
private Book[] listings;
// Contains all books in the library
// Not guaranteed that every location is a valid book

private int totalListings;
// Represents the total number of books in the library

private static final int DEFAULT_SIZE = 8;
// Default size the library is set to

public Library()
{
    listings = new Book[DEFAULT_SIZE];
}
// Default and only constructor
// Create a library with a capacity of DEFAULT_SIZE

public boolean addListing(String t, String a, int y)
{
        if (totalListings < DEFAULT_SIZE) //this may also be written as if(totalListings < DEFAULT_SIZE)
        {
            System.out.println("Your book " + t + ", written by " + a + ", on " 
                    + y + " was added to the library.");
            Object[] newObj = appendValue(listings, t, a, y);
            totalListings++; 
            return true;          
        }
        else{
            System.out.println("There was no more room in the library.");
            return false;
        }
}

private Object[] appendValue(Book[] listings, String t, String a, int y) {

ArrayList<Object> temp = new ArrayList<>(Arrays.asList(listings));
temp.add(new Book(t, a, y));
return temp.toArray();
  }
// Try to add a book
// Return true if the book can be added
// If there are no spots left return false and don't add the book

public void removeListing(String title, String author, int year){
    for(int i=0; i<listings.length; i++){
        if(listings[i].getTitle().equals(title)){
            if(listings[i].getAuthor().equals(author)){
                if(listings[i].getYear() == year){
                    System.out.println("Found your book.");
                }
            }
        }
    } 
}

2 个答案:

答案 0 :(得分:0)

您收到NullPointerException,因为listings[i].getTitle()为空。列表的标题为空,因为您实际上从未为listings中的任何8本书设置标题。

要快速修复NullPointerException,请将if语句更改为以下内容:

if(title.equals(listings[i].getTitle())) {
    ...
}

listings[i]没有标题时,这将返回false。

要修复整个程序,您的appendValue功能会出现错误。你永远不会真正修改listings。看起来应该是这样的:

private void appendValue(Book[] listings, String t, String a, int y) {
    listings[totalListings] = new Book(t, a, y);
}

答案 1 :(得分:0)

在构造函数中,您正在使用大小为8的Book []初始化列表,但不填充任何值。

listings = new Book[DEFAULT_SIZE];

我添加了一个方法getBooksDetails()供您理解,它打印Book []的详细信息。

public void getBooksDetails(){
    System.out.println("Default size of listings-" + listings.length);
    System.out.println("Occupied size of listings-" + totalListings);

    for (int i = 0; i < listings.length; i++) {
        System.out.println(listings[i]);
    }
}

如果从main()调用此方法,则可以在控制台中看到以下输出。

public static void main(String... args){
    Library library = new Library();
    library.getBooksDetails();
}

<强>输出

  

listing-8的默认大小

     

列表的占用大小-0

     

     

     

     

     

     

     

     

当您调用Library构造函数时,您的列表将包含8个null元素。因此,如果调用removeListing(),将获得nullpointer异常。 你应该

  • 调用addListing()将图书添加到列表中。
  • 而不是从addListing()调用appendValue,只将Book对象添加到addListing()中的列表,如下所示,

    listing [totalListings ++] = new Book(t,a,y);

  • 在removeListing()的for循环中使用totalListings,因为你在addListing()方法中增加了相同的值。