2010-07-12 100 views
1

我有以下全局阵列...奇怪的空指针异常

public static float camObjCoord[] = new float[8000]; 

我有一个方法饲用价值为它的索引我要送他们是这样的...

layers.addcube(-6, -2, -6, -2); 

i被一个类变量声明为..

int i = 0; 

和层被声明为...

GLLayer layers = new GLLayer(this); 

但是当我做我得到一个NullPointerException ....

public void addcube(float highx, float lowx, float highz, float lowz){ 
    //Constructing new cube... 

    cubes++; 
    float highy = 4.5f; 
    float lowy = 2.5f; 

    //FRONT 
    Global.camObjCoord[i] = highx; //null pointer here. 

没有人有任何想法,为什么它给了我一个空指针?有更多的代码,但我认为只给你相关的东西是足够的。

感谢

+2

后堆栈跟踪你正在得到。 – 2010-07-12 13:20:37

+1

'i'(以及扩展名'Global.camObjCoord.length')的值是什么? – ChrisF 2010-07-12 13:20:38

+0

@ ChrisF根据条件 – Skizit 2010-07-12 13:21:53

回答

3

尝试将其更改为这样:

​​3210

当我想你somwehere更新camObjCoord并将其设置为null。否则,我不知道如何在该行中获得NullPointerException。

+0

为什么要声明它最终解决了这个问题? – DaveJohnston 2010-07-12 13:26:53

+1

@DaveJohnston:我引用:“正如我假设你有更新camObjCoord并将其设置为null,否则我不会看到如何在该代码中获得NullPointerException。” – 2010-07-12 13:28:38

+2

@DaveJohnston - 也许是因为你以后不能将camObjCoord设置为null,因为它是最终的? – 2010-07-12 13:29:30

3

你确定这是一个NullPointerException,而不是一个ArrayIndexOutOfBoundsException?如果start != 0,那么i是数组的长度。但是,数组索引从0运行到length - 1 - 因此您需要i = Global.camObjCoord.length - 1;以在声明引发异常的行中获取有效的索引。

2

最高阵列指数应为array.length - 1。因此,

if(start != 0){ 
     i = Global.camObjCoord.length - 1; 
    } 
0

您正在分配i = array.length,然后指派给i处的元素。这将访问数组的末尾。

0

我认为,当你使用i = Global.camObjCoord.length;,它集i = 8000,所以当你尝试把你的价值,它把它的指数8000,这是不可能的表会从0到7999

试试这个以确保:

//FRONT 
    System.out.println('Value of index i : '+i); 
    Global.camObjCoord[i] = highx; //null pointer here. 

然后,你应该看到i的值,看看它是否超出了数组边界。

希望我帮上忙了。

1

鉴于您显示的代码,不能有NullPointerException。或者异常发生在不同的行,或者它是一个不同的异常,或者你将数组设置为null。

0

你应该发布堆栈跟踪,因为我认为它不是NullPointerException而是ArrayIndexOutOfBoundsException。如果你设置了i = Global.camObjCoord.length,那么你不能使用i索引数组,因为它将离开数组的末尾。想想看,如果你有一个大小为1的数组,那么你可以使用的唯一索引是0,如果你试图访问元素1,你将离开数组的末尾,从而得到一个异常。

2

请注意,如果该行在执行之前被指定camObjCoord的值,则该行可以抛出异常。这是相当苦逼这种情况,但它是可能的(例如,如果先前的初始化包含一个方法调用并访问camObjCoord该方法内):

public class NPEThrower { 
    Object x = initX(); 
    float[] foo = new float[8000]; 

    private Object initX() { 
     int l = foo.length; 
     return "x"; 
    } 
} 

注意添加final到外地定义不解决这意味着您可以在执行期间观察final字段的两个不同值:null和实际值!)。

0

像inflagranti已经指出 - 在唯一的方式在这里得到真正的NPE是有camObjCoord设置为null

这是为了测试它的方式:

// DEBUG Code - start 
if (camObjCoord == null) { 
    System.out.println("Who the F*** played with comObjCoord! NPE comeing next."); 
} 
if (i >= camObjCoord.length) { 
    System.out.println("There's nothing outside the array. AIOOBE thrown ... now!"); 
} 
// DEBUG Code - end 

Global.camObjCoord[i] = highx; //null pointer here.