2013-05-05 56 views
0

每當我編譯下面的代碼,它給出了java.lang.NullPointerException錯誤。我看了我的代碼,但似乎是正確的。它是編譯器損壞還是我錯過了什麼?爲什麼編譯器給出.NullPointerException錯誤

public byte[][] divi(byte[] pac, int pac_len){ 
     int set = 0 ; 
     byte [][] data = null; 

     for(int i= 0 ; set != pac_len; i++) { 
      if (set + 33 <= pac_len) { 
       data[i] = new byte[33]; 
       System.arraycopy(pac, set, data[i], 0, 33); 
      } 
     } 
    } 
+6

NullPointerException是一個運行時異常,在編譯期間無法獲取它。 – Jops 2013-05-05 10:08:53

+0

是否有編譯時異常? – tarrsalah 2013-05-05 10:22:26

+0

如果你說的是真的,你已經發現了一個極其罕見的編譯器錯誤。你應該在Java Bug Parade上報告它。更可能你只是在濫用術語。編輯堆棧跟蹤到你的問題將解決這種或那種方式。 – EJP 2013-05-05 10:40:17

回答

9

當然,你錯過了什麼:分配

byte [][] data = null; 

明確指定nulldata。之後,您將作業指定爲data[i],這將導致NullPointerException

重寫上述線

byte [][] data = new byte[][pac_len]; 

應該解決的問題NPE

它不會修復無限循環問題 - 您需要爲此調整set變量。目前,set不會改變,所以循環是無限的。它看起來像你的代碼試圖將一個長數組分成33個字節的塊。當pac_len不能被33整除時,您需要特別注意這一情況,因爲環路條件要求set正好是pac_len才能退出。

1

首先,NPE運行時異常,你不會在編譯時得到它。

其次,您將null指定爲data,然後嘗試訪問它。當然是NPE

第三,你固定的上述兩個問題後,您應該解決您的循環:for(int i= 0 ; set != pac_len; i++)

你的情況是不是在這個循環良好。 i可能會超出數組邊界,這可能會導致您ArrayOutOfBoundException,您應該確保i永遠不會超過數組的長度(您的循環是無限的..)

相關問題