2013-05-05 85 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永远不会超过数组的长度(您的循环是无限的..)

相关问题