web-dev-qa-db-ja.com

Java HashMap get method null pointer exception

次のようなコードがあります:-

_class A
{
  private HashMap<Character, Boolean> myMap;
  public A()
  {
    myMap = new HashMap<Character, Boolean>();
    String mychars = "asdfzxcvqwer";
    for ( char c : mychars.toCharArray() )
        myMap.put(c, true);
  }
  public doo(String input)
  {
    StringBuilder output = new StringBuilder();
    for ( char c : input.toCharArray() )
    {
      if ( myMap.get(c) )
         output.append(c);
    }
  }
  ...
  ...
}
_

if ( myMap.get(c) )行でnullポインタ例外が発生しました-何が間違っていますか?

14
user277465

cmyMapに含まれていない場合、nullが返されますが、booleanとしてボックス化解除することはできません。

試してください:

Boolean b = myMap.get(c);
if(b != null && b){
...
46
xlecoustillier

myMapcに一致するキーが含まれていない場合、myMap.get(c)はnullを返します。その場合、JVMがJava.lang.Booleanオブジェクトをbooleanプリミティブに入れて条件を実行すると、nullオブジェクトが見つかったため、Java.lang.NullPointerException

次のブロックは、例にあるものと同等であり、NullPointerExceptionがある理由を理解しやすくする必要があります。

if (((Boolean) myMap.get(c)).booleanValue()) 

元の状態を次のように書き直します。

if ( myMap.containsKey(c) )

これがお役に立てば幸いです。

12
Nuno Guerreiro

変化する

if ( myMap.get(c) )

if ( myMap.containsKey(c) && myMap.get(c))
6
Jiji

これを変える

_for ( char c : input.toCharArray() )
{
  if ( myMap.get(c) )
     output.append(c);
}
_

このため

_for ( char c : input.toCharArray() )
{
  if ( myMap.containsKey(c) )
     output.append(c);
}
_

マップの定義されたメソッドを使用して、特定のキーがマップに登録されているかどうかを確認します。あなたはキーのグループをチェックしたいと思われるので、forはそのままにしておきます。

myMap.get(c)は、そのキーに関連付けられた値を返します。キーが登録されていない場合は、nullを返します。

補足として、このメソッドをカスタムオブジェクトで使用する場合は、hashcodeおよびequalsメソッドを再定義する必要があることに注意してください。

提案:コードの正しい解釈ではない場合、それを無視してください。マップに特定の値が「含まれている」かどうかを判断するブール値のみが含まれている場合、マップはそのコンテキストでは意味をなさないため、代わりにHashSetを使用することを強くお勧めします。

3
Fritz

マップに必要なCharacterを持つエンティティが存在しない場合、map.get(key)nullを返し、ifステートメント内でNullPointerExceptionがスローされます。

3
bellum

暗闇の中で刺す:cに割り当てられた特定のキャラクターのエントリがマップにありますか?存在しない場合、Javaはnull値のボックス化を解除しようとしている可能性があります...

3
Dan Vinton

あなたのコードは非常に面倒です。

  • doは予約キーワードであり、メソッド名として使用しないでください。
  • 'if'式は、nullではなくブール値を返す必要があります。
  • myMapの初期化が正しく書き込まれていません

これが作業バージョンです:

import Java.util.HashMap;

public class A {
    private HashMap<Character, Boolean> myMap;

    public A() {
        this.myMap = new HashMap<Character, Boolean>();
        String mychars = "asdfzxcvqwer";
        for ( char c : mychars.toCharArray() )
            myMap.put(c, true);
    }

    public String execute(String input) {
        StringBuilder output = new StringBuilder();
        for ( char c : input.toCharArray() )
        {
            if ( this.myMap.get(c) != null )
                output.append(c);
        }
        return output.toString();
    }


    public static void main(String[] args) {
        A test = new A();
        test.execute("abc");
    }
}