2011-03-22 49 views
0

下面是從哈希表中的數組中刪除數字的一些代碼。它使用二次函數。如何避免while語句中的空指針異常?謝謝!while循環中的Java空指針異常

public Integer[] quadDelete(Integer[] array, int k) 
{ 
    int i =0; 
     while(array[i]!=k && i<array.length){ //This causes a null pointer exception 
      i = (hashFunction(k) + 4*i + 7*i*i) % divideAmount;     
      if(array[i]==k) 
      array[i]= null;     

     } 

    return array; 
} 
+0

你可以給你作爲參數傳遞的數組[]的值嗎? – 2011-03-22 04:11:22

+1

也,你沒有問這個問題,但有一個問題,你會得到IndexOutOfBoundsExceptions因爲你做的數組[我]檢查,如果I MeBigFatGuy 2011-03-22 04:32:04

回答

0

檢查是否array[i]是空的array[i]!=k前第一。在進入while循環之前,還要檢查array本身是否爲空。

0

假設arraynull

  1. 你是不是遞增i,所以如果array[i]==k,然後array[i]被設置爲null。當它試圖從Integer中取消裝箱值時,你將在循環中第二次獲得NPE。
  2. 在while循環測試中,您應該檢查i是否在範圍之前試圖訪問array[i],而不是之後。
+0

1)我在while循環的第一行中改變了i的值。它可能不會總是改變,但也許這是故意的。 2)這是正確的,但是這會拋出一個'ArrayIndexOutOfBoundsException'而不是NPE。 – MAK 2011-03-22 04:11:07

+0

@MAK - 事實上,它並不總是改變很可能是問題的一部分......鑑於代碼不拆箱數組元素之前檢查'null'。 – 2011-03-22 04:39:23

+0

@MAK - 你說得對第2點。我應該清楚,這不是NPE的來源,但如果不固定,以後會導致麻煩。 – 2011-03-22 06:15:27

0

如果你說你在循環條件中得到NPE,唯一可能的原因可能是傳遞的數組對象爲null。在檢查循環條件之前檢查數組是否爲空。

0

下面的代碼的版本糾正,以避免例外:

public Integer[] quadDelete(Integer[] array, int k) { 
    int i = 0; 
    while (i < array.length && array[i] != null && array[i] != k) { 
     i = (hashFunction(k) + 4 * i + 7 * i * i) % divideAmount;     
     if (i < array.length && array[i] != null && array[i] == k) { 
      array[i] = null;     
     } 
    } 
    return array; 
} 

但我不認爲這個版本的代碼,使反正多大意義:

  • if條件是真的,你分配nullarray[i]這使得while條件錯誤...所以循環終止。

  • 如果我們假設hashFunction是它的參數k的純函數,那麼在某些情況下i重新計算會給出相同的值,循環將不會終止。

+0

我很確定'i'應該是在那裏增加的。 – 2011-03-22 06:16:34