26

私のコードは次のようになります。

public 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 void doo(String input) {
            StringBuilder output = new StringBuilder();
            for (char c : input.toCharArray()) {
                if (myMap.get(c))
                    output.append(c);
            }
        }
        //...
        //...
    }

その行でnullポインタ例外(NPE)が発生するのはなぜif (myMap.get(c))ですか?

4

9 に答える 9

64

cに含まれていない場合はmyMap、を返します。nullこれは、として箱から出すことはできませんboolean

試す :

Boolean b = myMap.get(c);
if(b != null && b){
...
于 2012-12-03T16:19:53.590 に答える
17

myMapに一致するキーが含まれていない場合はcmyMap.get(c)nullを返します。その場合、JVMは、java.lang.Booleanオブジェクトであると予想されるものをbooleanプリミティブにアンボックスして条件を実行すると、nullオブジェクトを検出するため、をスローしjava.lang.NullPointerExceptionます。

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

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

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

if ( myMap.containsKey(c) )

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

于 2012-12-03T16:28:10.803 に答える
7

変化する

if ( myMap.get(c) )

if ( myMap.containsKey(c) && myMap.get(c))
于 2012-12-03T16:30:55.900 に答える
3

Characterマップにrequiredを持つエンティティがない場合は、 map.get(key)returnsnullとinsideステートメントがスローifにつながります。NullPointerException

于 2012-12-03T16:19:35.033 に答える
3

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

于 2012-12-03T16:22:52.163 に答える
3

これを変更する

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か、キーが登録されていない場合に返します。

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

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

于 2012-12-03T16:30:19.050 に答える
2

あなたのコードは非常に乱雑です。

  • 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");
    }
}
于 2012-12-03T16:25:56.873 に答える
1

または、 apache.commons.lang3を使用して、チェックをチェックし、チェックをBoolean処理することもできます。nullBooleanUtils.isTrue(c)

説明:

正確にNPEがスローされている場合、つまりget()、マップ上で呼び出されたとき、またはif(...)実行されたときは、一般的な混乱があります。

マップは次のように宣言されています。

myMap = new HashMap<Character, Boolean>();

これには、マップエントリの値としてプリミティブbooleanラッパークラスが含まれています。Boolean

あなたがするとき:

if (myMap.get(c))

myMapこれは、特定のキーがマップに存在しないために呼び出されたときにHashMap返されます。次に、ボックスが解除されてプリミティブになります。これは、単独で呼び出す場合ではなく、NPEがスローされる場所です。nullget()nullbooleanget()

于 2020-05-05T22:29:30.757 に答える
0

私の場合、私はそれをキャッチブロックで処理しました。

@PostMapping("/findAllLastExecutedApi")
    public ResponseEntity<Map<String,List<Results>>>findAllLastExecuted(@RequestBody Map<String,String> uuids) {
        try{ 
            // NPE is triggered here : 
            if(uuids.get("demoId").isEmpty()) {
                Map<String,List<Results>> badResults= Collections.singletonMap("Invalid demoId provided, is empty",null);
                log.error("Invalid demoId provided, is empty {}",uuids);
                return  ResponseEntity.ok(badResults);
            }

            Map<String,List<Results>> results =
                    this.service.findAll(uuids.get("demoId"));
            return ResponseEntity.ok(results);

        }catch (NullPointerException e){
            log.error("Invalid demoId provided, is null {}",uuids);
            throw new NullPointerException("Invalid demoId provided , is null");
        }
    }
于 2021-04-05T21:00:55.083 に答える