簡體   English   中英

嘗試在Java中返回HashMap值時出現空指針異常

[英]Null Pointer exception when trying to return HashMap value in java

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

我有:沒有異常消息。 然后測試崩潰。

您需要了解可變陰影。

從一個簡單的示例開始,不使用構造函數:

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

ngram字段仍然為空,因為您在構造函數的范圍內聲明了一個新變量(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;

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

因為,在構造函數內部,您正在創建另一個局部變量並對其進行定義,而不是在定義類級成員變量本身。

如果未初始化,則映射類型的實例成員將始終為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;
    }
}

並且不要在實現中鍵入任何成員/變量。 如果可能,您應該使用接口進行輸入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM