0

我无法追踪为什么这里会抛出空指针异常,我确信这很简单,但不知何故我错过了它。调用方法时会抛出它checkoutBook。这里有什么帮助吗?

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


class Library {

    HashMap<String, List<String>> checkoutBooks;
    Library() {

        HashMap<String, List<String>> checkoutBooks = new HashMap<String, List<String>>();

    }


    public void checkoutBook(String isbn, String patron) {

        if (checkoutBooks.containsKey(isbn)) {
         checkoutBooks.get(isbn).add(patron);
        } else {
            List<String> patronlist = new ArrayList<String>();
            patronlist.add(patron);
            checkoutBooks.put(isbn, patronlist);
            System.out.println("hello");
        }
    }


    public static void main(String[] args){
        Library library = new Library();
        library.checkoutBook("000", "Cay Horstman");
       library.checkoutBook("000", "Sharron Morrow");

     }

}
4

4 回答 4

3

因为您没有为此变量分配任何值:

HashMap<String, List<String>> checkoutBooks;

您刚刚在构造函数中定义了新的。所以删除那个实例checkoutBooks变量,或者这样做:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


class Library {

    HashMap<String, List<String>> checkoutBooks;
    Library() {

        checkoutBooks = new HashMap<String, List<String>>();

    }


    public void checkoutBook(String isbn, String patron) {

        if (checkoutBooks.containsKey(isbn)) {
         checkoutBooks.get(isbn).add(patron);
        } else {
            List<String> patronlist = new ArrayList<String>();
            patronlist.add(patron);
            checkoutBooks.put(isbn, patronlist);
            System.out.println("hello");
        }
    }


    public static void main(String[] args){
        Library library = new Library();
        library.checkoutBook("000", "Cay Horstman");
       library.checkoutBook("000", "Sharron Morrow");

     }

}
于 2013-10-18T22:56:48.177 回答
1

因为您没有在构造函数中初始化该字段 checkoutBooks。您初始化了一个同名的局部变量。将您的构造函数更改为:

HashMap<String, List<String>> checkoutBooks;
Sandbox() {

    checkoutBooks = new HashMap<String, List<String>>();

}
于 2013-10-18T22:56:32.213 回答
1

在 Library 构造函数中,您声明了一个名为 的局部变量checkoutBooks并对其进行了初始化,但您并未在类级别初始化同名字段。一些建议:

  1. 至少,要修复错误,请将构造函数更改为仅进行赋值而不是声明新变量:

    Library() {
        checkoutBooks = new HashMap<String, List<String>>();
    }
    
  2. 由于您没有checkoutBooks在构造后重新分配该字段,因此您可以声明该字段final。然后它会在编译时立即捕获这种错误,因为final需要初始化字段。它还可以防止以后意外重新分配该字段,从而增强稳健性。

    class Library {
        final HashMap<String, List<String>> checkoutBooks;
        ...
    
  3. 由于您没有在构造函数中执行任何其他操作,因此您可以将初始化直接内联到字段声明中:

    class Library {
        final HashMap<String, List<String>> checkoutBooks = new HashMap<String, List<String>>();
        // no constructor
        ...
    
  4. 从 Java 7 开始,您可以通过使用避免重复类型参数<>

    class Library {
        final HashMap<String, List<String>> checkoutBooks = new HashMap<>();
    
于 2013-10-18T23:08:10.660 回答
0

checkoutBooks.containsKey 在构造函数中使用时为空 HashMap<String, List<String>> checkoutBooks = new HashMap<String, List<String>>();,这就是为什么会出现异常

class Library {

    HashMap<String, List<String>> checkoutBooks;
    Library() {

       checkoutBooks = new HashMap<String, List<String>>(); // just change here 

    }


    public void checkoutBook(String isbn, String patron) {

        if (checkoutBooks.containsKey(isbn)) {
         checkoutBooks.get(isbn).add(patron);
        } else {
            List<String> patronlist = new ArrayList<String>();
            patronlist.add(patron);
            checkoutBooks.put(isbn, patronlist);
            System.out.println("hello");
        }
    }


    public static void main(String[] args){
        Library library = new Library();
        library.checkoutBook("000", "Cay Horstman");
       library.checkoutBook("000", "Sharron Morrow");

     }

}
于 2013-10-18T23:05:13.300 回答