2

整数の出現をカウントするために単純なツリーマップを実装しようとしましたが、それは私にを与えており、NullPointerExceptionそれを修正する方法がわかりません。

Exception in thread "main" java.lang.NullPointerException
    at exercises.CountOccurances_20_07.main(CountOccurances_20_07.java:21)

コードは次のとおりです。

import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class CountOccurances_20_07 
{
    public static void main(String[] args) 
    {
        int[] list = {2, 3, 40, 3, 5, 4, 3, 3, 3, 2, 0};
        Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
        for(int i: list)
        {
            int key = list[i];
            if(list.length > 1)
            {
                if(map.get(key) == 0)
                {
                    map.put(key, 1);
                }
                else
                {
                    int value = map.get(key).intValue(); // line 21
                    value ++;
                    map.put(key, value);
                }
            }
        }
        //get all entries into set
        Set<Map.Entry<Integer, Integer>> entrySet = map.entrySet();
        //get key and value from entry set
        for(Map.Entry<Integer, Integer> entry: entrySet)
            System.out.println(entry.getValue() + "\t" + entry.getKey());
    }
}
4

4 に答える 4

7

あなたの場合、 map.get(key) が返さnullれ、0になることはありません。また、キーを使用して、それ自体を検索していますが、正しく聞こえません。

for(int key: list) {
    Integer count = map.get(key);
    if (count == null) count = 0;
    map.put(key, count+1);
}
于 2012-08-30T09:34:14.837 に答える
2

21NullPointerException行目

int value = map.get(key).intValue(); // line 21

がマップに存在しないmap.get(key)場合は null を返すためです。key

使用する必要があります

if(!map.containsKey(key)){
}

それ以外の

if(map.get(key) == 0) {
}

評価されるように

if(null == 0){
}

条件が false の場合、コントロールは 21 行目に移動します。

于 2012-08-30T09:35:17.840 に答える
1

変化する

map.get(key) == 0 

map.get(key) == null  

また

!map.contains(key)
于 2012-08-30T09:35:52.610 に答える
1

あなたのコードには多くの明らかな欠陥があります。

Map空のマップとしてその場で構築されますが、すぐにクエリが実行され、get結果がアンボックス化されます。

Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
...
if(map.get(key) == 0)

getゼロではなく、存在しないマップ エントリを返しますnull。null 引数の場合、ボックス化解除は失敗します。


ここでlistはその場で初期化されますが、長さがチェックされます。

int[] list = {2, 3, 40, 3, 5, 4, 3, 3, 3, 2, 0};
if(list.length > 1)

これは冗長なチェックです。削除してください。


for(int i: list)
{
  int key = list[i];

使い方int iが間違っている可能性が高いです。強化された forループは、各配列要素を順番に に割り当てiますfor (int key : list)


int value = map.get(key).intValue(); // line 21

呼び出しintValueは冗長です -- 自動ボックス化解除がこれを処理します。アンボックスを試みる前に、値が null でないことを確認する必要があります。

于 2012-08-30T09:39:57.940 に答える