我正在处理我的java项目并在尝试返回HashMap值时获取空指针异常消息。
public class NgramModel
{
private HashMap<String,Integer> ngram;
public NgramModel()
{
HashMap<String,Integer> ngram = new HashMap <String, Integer>();
ngram.put("aa", 2);
}
public HashMap<String,Integer> getValue() {
return ngram;
}
}
当我的JUnit测试到达时:
assertEquals(2,(int)test.getValue().get("aa"));
我有:没有异常消息。测试崩溃了。
答案 0 :(得分:3)
您需要了解变量阴影。
从一个简单的例子开始,不使用构造函数:
static int test = 10;
public static void main(final String[] args) throws IOException {
int test = 20;
System.out.println(test);
}
此代码打印什么?
答案是20
。原因是您在方法中声明的test
实际上是与您在类中声明的不同的 test
。你有两个不同范围的变量。
您在此处遇到同样的问题:
public class NgramModel {
//one `ngram`
private HashMap<String,Integer> ngram;
public NgramModel() {
//a second `ngram`
HashMap<String,Integer> ngram = new HashMap <String, Integer>();
ngram.put("aa", 2);
}
}
你不需要重新声明变量:
public class NgramModel {
//one `ngram`
private HashMap<String,Integer> ngram;
public NgramModel() {
//reference the `ngram` from above
ngram = new HashMap <String, Integer>();
ngram.put("aa", 2);
}
}
答案 1 :(得分:1)
字段ngram仍为null,因为您在构造函数的范围内声明了一个新变量(ngram)。请尝试以下方法:
public NgramModel() {
ngram = new HashMap...
}
答案 2 :(得分:0)
使用这种方式 -
import java.util.HashMap;
public class NgramModel
{
private HashMap<String,Integer> ngram;
public NgramModel()
{
ngram = new HashMap <String, Integer>();
ngram.put("aa", 2);
}
public HashMap<String,Integer> getValue() {
return ngram;
}
}
OR
import java.util.HashMap;
public class NgramModel
{
private HashMap<String,Integer> ngram = new HashMap <String, Integer>();
public NgramModel()
{
ngram.put("aa", 2);
}
public HashMap<String,Integer> getValue() {
return ngram;
}
}
因为,在构造函数中,您正在创建另一个局部变量并定义它,而不是自己定义类级别成员变量。
答案 3 :(得分:0)
如果未初始化,则map类型的实例成员将始终为null。在这种情况下,您应该重新编写代码,例如
public class NgramModel
{
private Map<String,Integer> ngram;
public NgramModel() {
ngram = new HashMap <String, Integer>();
ngram.put("aa", 2);
}
public Map<String,Integer> getValue() {
return ngram;
}
}
不要使用实现键入任何成员/变量。如果可能的话,你应该输入接口。