我有以下全局数组...
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.
有没有人知道它为什么给我一个空指针?有更多的代码,但我认为只给你相关的东西是足够的。
由于
答案 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.