0

これは私のコードです:

HashMap<String, HashSet<String>> map;
....// I didn't write those code that initial the map.
System.out.println(map.entrySet().size()); // run util here is ok, I get the size of the map.
for(Map.Entry<String, HashSet<String>> entry : map.entrySet()) {// here throw the exception
    Sytem.out.println("abc");// didn't executed, throw exception before
}

そして、私は例外を受け取ります:

スレッド「メイン」で例外 java.lang.NullPointerException at key.test.EnwikiOutlink.main(EnwikiOutlink.java:68)

マップ オブジェクトには 10,000 を超えるマップ オブジェクトがあり、サーバー マシンで実行しましたが、デバッグできませんでした。しかし、このマップのサイズを小さくすると (10,000 未満)、プログラムは正常に実行されます。問題の原因と解決策は何ですか? ありがとう!

4

4 に答える 4

2

どこでmap初期化されますか?実際に何も割り当てない場合は、もちろんになりますnull

(それがクラスメンバーなのかローカル変数なのかは明確ではありません。)

于 2012-04-13T11:34:58.433 に答える
1

マップに要素が含まれている場合map.entrySet()、(マップがnullでないため)スローされないNullPointerExceptionため、例外はループ内の要素の1つ(またはそのサブオブジェクト)にアクセスすることから発生する必要があります。

于 2012-04-13T11:36:43.050 に答える
1

私はこれを試しました:そしてそれはうまくいきました。マップはどこかでnullに割り当てられている必要があります。

HashMap<String, HashSet<String>> map;
map = new HashMap<String, HashSet<String>>();

for(Map.Entry<String, HashSet<String>> entry : map.entrySet()) {

}
于 2012-04-13T11:36:54.057 に答える
0

mapローカル変数 (インスタンス フィールドではない) である場合、たとえマップ自体が別のスレッドからアクセス可能であり、そのスレッドが考えられるあらゆる方法でマップを変更したとしても、既に成功した後にNPE を取得することは理論的に不可能です。スタックトレースの最初のエントリが、自分のコードから呼び出されたコードではなく、自分のコードの行である場合、それが起こる唯一の方法は、変数自体を. したがって、診断の手がかりを再検討する必要があると思います。map.entrySet()map.entrySet().size()mapnull

于 2012-04-13T13:15:36.547 に答える