奇怪的空指针异常

时间:2010-07-12 13:18:58

标签: java nullpointerexception

我有以下全局数组...

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

我有一种方法将值输入到索引中我就像这样发送它们......

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

我是一个声明为..

的类变量
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.

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

由于

9 个答案:

答案 0 :(得分:3)

您确定这是NullPointerException而不是ArrayIndexOutOfBoundsException吗?如果是start != 0,则i是数组的长度。但是,数组索引从0到length - 1运行 - 所以你需要i = Global.camObjCoord.length - 1;来获得你声称抛出异常的行中的有效索引。

答案 1 :(得分:3)

尝试将其更改为:

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

我假设你有更新camObjCoord并将其设置为null。否则我看不出你怎么能在那一行得到一个NullPointerException。

答案 2 :(得分:2)

最高的数组索引应为array.length - 1。所以

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

答案 3 :(得分: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字段的2个不同值:null和实际值!)。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分: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的值,并查看它是否超出数组边界。

希望我有所帮助。

答案 7 :(得分:0)

你应该发布一个堆栈跟踪,因为我认为它不是NullPointerException而是ArrayIndexOutOfBoundsException。如果设置i = Global.camObjCoord.length,则无法使用i索引数组,因为它将不在数组的末尾。考虑一下,如果你有一个大小为1的数组,那么你可以使用的唯一索引是0,如果你试图访问元素1,你将不在数组的末尾,因此得到一个例外。

答案 8 :(得分: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.