2013-05-21 33 views
0

我知道它被問了很多次,但我仍然無法理解我的錯誤之前的put方法..的NullPointerException在HashMap中

這只是一個正常的代碼我寫計數陣列中的重複次數(: )這可能是做這是一個非常長的方法,請提出一個更小的方式也如果你能想到的)

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; 
}  

for循環的put方法不會產生任何錯誤,但它確實爲實施在循環之外。

錯誤是這樣的:

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) 

附:算上++造成的錯誤......真是愚蠢..循環正想出界..

+0

我懷疑你找到正確的路線。首先,'HashMap'允許空鍵和值。其次,如果HashMap拋出異常,你會在堆棧跟蹤中看到它的方法。 – AlexR

+0

我沒有有意刪除空鍵,它只是代碼的一部分.. –

+0

我可以建議一個更小的方法因子的方法...public static longial(int n){ \t \t if(n == 1) \t \t \t return 1; \t \t return n * factorial(n-1); \t} –

回答

1

這是應該給予NPE行:

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

data.get(i)不存在(1<=i<=data),無論是有null檢查每個get價值或確保您的邏輯中所有i都存在您需要參考的地圖。

一種用於把空試驗:

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

它打印:

{null=null} 
+0

我真的不認爲語句引起的錯誤,因爲當我刪除涉嫌把語句消失了錯誤.. –

+0

缺少的東西那麼,究竟是什麼在行的代碼:54即TheSwapsDivTwo.find(TheSwapsDivTwo.java:54)。進一步把'null'不應該給NPE,否則你會在堆棧跟蹤中得到。看到我的更新代碼 – harsh

+0

得到了錯誤的感謝 –

0

貌似data.get(i)返回null。這是因爲你試圖讓不存在的元素(當i = data.size()

用途:

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

你把從1 data開始data.size()-1

BTW你應該修正縮進,並添加鍵{}畢竟if和else語句。

1

如果使用地圖,試試這個

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

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

然後遍歷地圖。否則,你可以使用多集Guava

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"); 
}