尝试在java中返回HashMap值时出现Null Pointer异常

时间:2014-05-03 18:20:22

标签: java pointers nullpointerexception hashmap

我正在处理我的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"));

我有:没有异常消息。测试崩溃了。

4 个答案:

答案 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;
    }
}

不要使用实现键入任何成员/变量。如果可能的话,你应该输入接口。