HashMap的put方法中的NullPointerException

时间:2013-05-21 11:26:26

标签: java hashmap put

我知道之前曾多次被问过,但我仍然无法理解我的错误。

这只是我正在编写的用于计算数组中重复次数的正常代码(:)这可能是一个非常长的方法,如果你能想到的话,请提出一个更小的方法)

public int find(int[] sequence)
{
    Arrays.sort(sequence);

    int temp=0,count=0,j=0;

    HashMap<Integer,Integer> data = new HashMap<Integer,Integer>();

        for(int i:sequence){
        Integer c = new Integer(count);

        Integer d = new Integer(j);

        if(i!=temp) {

        if(count!=0) data.put(c,d);
        count++;

        j=1;

        temp=i;


        }


        else j++;


        }

        count++;//This one causes the error
        //System.out.println(count);
        Integer c = new Integer(count);

        Integer d = new Integer(j);

        data.put(c,d);

            long ans =  TheSwapsDivTwo.factorial(sequence.length);



        for(int i=1;i<=data.size();i++){

                ans /=  TheSwapsDivTwo.factorial(data.get(i).intValue());
                System.out.println(data.get(i));
                }

                return (int)ans;

}

public static long factorial(int n) {
            long fact = 1; // this  will be the result
            for (long i = 1; i <= n; i++) {
                fact *= i;
            }
            return fact;
}       

put方法在for循环中不会产生任何错误,但它会在循环外实现。

错误是这样的:

java.lang.NullPointerException
at TheSwapsDivTwo.find(TheSwapsDivTwo.java:54)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.topcoder.services.tester.java.TestProcess$Runner.run(TestProcess.java:386)

P.S。 count ++导致错误...愚蠢真的..循环超出界限..

3 个答案:

答案 0 :(得分:1)

这是应给予NPE的界限:

TheSwapsDivTwo.factorial(data.get(i).intValue());

即。 data.get(i)不存在1<=i<=data,要么对每个null值进行get检查,要么确保在您的逻辑中所有i都出现在地图中你需要推荐。

放置null的测试:

Map<Integer, Integer> m = new HashMap<Integer, Integer>();
m.put(null, null);
System.out.println(m);

打印:

{null=null}

答案 1 :(得分:1)

如果使用地图,请尝试此

for (Item i : list)
   {
     Integer f = map.get(i);

     if (f == null)
         map.put(i, 1);
     else
         map.put(i, ++f);
   }

然后遍历地图。或者您可以使用Guava

中的 MultiSet
Multiset<Item> items = HashMultiset.create(sequence);
   System.out.println(items.count(someItem));
     for (Multiset.Entry<Item> entry : items.entrySet()) {
   System.out.println(entry.getElement() + " - " + entry.getCount() + " times");
 }

答案 2 :(得分:0)

看起来data.get(i)返回null。之所以会发生这种情况,是因为您尝试获取非现有元素(当i = data.size()

使用:

for(int i=1;i<data.size();i++){

您放入data的密钥从1开始到data.size()-1

顺便说一句,你应该修改缩进并在所有if和else语句之后添加{}。