尝试在java中返回HashMap值时出现空指针异常

尝试在java中返回HashMap值时出现空指针异常,java,pointers,nullpointerexception,hashmap,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

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

我得到:没有例外信息。测试崩溃。

字段ngram仍然为空,因为您正在构造函数的作用域中声明一个新变量(ngram)。请尝试以下操作:

public NgramModel() {
  ngram = new HashMap...
}

字段ngram仍然为null,因为您正在构造函数的作用域中声明一个新变量(ngram)。请尝试以下操作:

public NgramModel() {
  ngram = new HashMap...
}
这样-

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;
    }
}
import java.util.HashMap;
公共类ngramodel
{
私有HashMap-ngram;
公共ngramodel()
{
ngram=newhashmap();
ngram.put(“aa”,2);
}
公共HashMap getValue(){
返回ngram;
}
}

import java.util.HashMap;
公共类ngramodel
{
私有HashMap ngram=newhashmap();
公共ngramodel()
{
ngram.put(“aa”,2);
}
公共HashMap getValue(){
返回ngram;
}
}
因为,在构造函数中,您正在创建另一个局部变量并定义它,而不是定义类级成员变量本身。

使用这种方式-

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;
    }
}
import java.util.HashMap;
公共类ngramodel
{
私有HashMap-ngram;
公共ngramodel()
{
ngram=newhashmap();
ngram.put(“aa”,2);
}
公共HashMap getValue(){
返回ngram;
}
}

import java.util.HashMap;
公共类ngramodel
{
私有HashMap ngram=newhashmap();
公共ngramodel()
{
ngram.put(“aa”,2);
}
公共HashMap getValue(){
返回ngram;
}
}

因为,在构造函数中,您正在创建另一个局部变量并定义它,而不是定义类级成员变量本身。

您需要了解变量隐藏

从一个简单的示例开始,不要使用构造函数:

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);
    }
}
公共类ngramodel{
//一个ngram`
私有HashMap-ngram;
公共ngramodel(){
//第二个ngram`
HashMap ngram=新的HashMap();
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);
    }
}
公共类ngramodel{
//一个ngram`
私有HashMap-ngram;
公共ngramodel(){
//参考上面的“ngram”
ngram=newhashmap();
ngram.put(“aa”,2);
}
}

您需要了解变量阴影

从一个简单的示例开始,不要使用构造函数:

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);
    }
}
公共类ngramodel{
//一个ngram`
私有HashMap-ngram;
公共ngramodel(){
//第二个ngram`
HashMap ngram=新的HashMap();
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);
    }
}
公共类ngramodel{
//一个ngram`
私有HashMap-ngram;
公共ngramodel(){
//参考上面的“ngram”
ngram=newhashmap();
ngram.put(“aa”,2);
}
}

映射类型的实例成员如果未初始化,将始终为空。在这种情况下,您应该对代码进行如下重新表述

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;
    }
}
公共类ngramodel
{
私有地图;
公共ngramodel(){
ngram=newhashmap();
ngram.put(“aa”,2);
}
公共映射getValue(){
返回ngram;
}
}

并且不要在实现中键入任何成员/变量。如果可能,您应该使用接口进行键入。

映射类型的实例成员如果未初始化,则将始终为空。在这种情况下,您应该对代码进行如下重新表述

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;
    }
}
公共类ngramodel
{
私有地图;
公共ngramodel(){
ngram=newhashmap();
ngram.put(“aa”,2);
}
公共映射getValue(){
返回ngram;
}
}

并且不要在实现中键入任何成员/变量。如果可能的话,您应该使用接口进行键入。

您正在构造函数中隐藏您的实例变量。@zouzu这是答案,您不想在大文本区域中写入它吗?抱歉,我没有完全理解。@user2758935读到:@hgoebl/Aarowaim太懒了,无法写入:)继续!您正在构造函数中隐藏您的实例变量。@Zouzu这是答案,您不想在大文本区域中写入它吗?很抱歉,我没有完全理解它。@user2758935读到:@hgoebl/Aarowaim太懒了,无法写入:)继续!