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

在第NullPointerException21 行

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

并且您的条件为假,然后控制转到第 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是多余的——自动拆箱会解决这个问题。在尝试拆箱之前,您确实需要确保该值不为空。

于 2012-08-30T09:39:57.940 回答