为什么在Java中使用此代码抛出nullpointerexception?

时间:2013-10-18 22:54:22

标签: java class nullpointerexception hashmap

我无法追踪为什么在这里抛出空指针异常,我确信这很简单,但不知怎的,我错过了它。调用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 个答案:

答案 0 :(得分: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");

     }

}

答案 1 :(得分:1)

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

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

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

}

答案 2 :(得分:1)

在库构造函数中,声明一个名为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<>();
    

答案 3 :(得分:0)

checkoutBooks.containsKey  在构造函数中使用HashMap<String, List<String>> checkoutBooks = new HashMap<String, List<String>>();时为null,这就是获取Exception的原因

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");

     }

}