我无法追踪为什么在这里抛出空指针异常,我确信这很简单,但不知怎的,我错过了它。调用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");
}
}
答案 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
的局部变量,并对其进行初始化,但不要在类级别初始化同名字段。一些建议:
至少要修复错误,请将构造函数更改为仅进行赋值,而不是声明新变量:
Library() {
checkoutBooks = new HashMap<String, List<String>>();
}
由于您在构建后未重新分配checkoutBooks
字段,因此您可以声明字段final
。然后它会在编译时立即捕获此类错误,因为需要初始化final
个字段。它还可以防止以后意外重新分配场地,从而提高稳健性。
class Library {
final HashMap<String, List<String>> checkoutBooks;
...
由于您不在构造函数中执行任何其他操作,因此可以将初始化直接内联到字段声明中:
class Library {
final HashMap<String, List<String>> checkoutBooks = new HashMap<String, List<String>>();
// no constructor
...
从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");
}
}