Странное исключение нулевого указателя - PullRequest
1 голос
/ 12 июля 2010

У меня есть следующий глобальный массив ...

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.

Кто-нибудь знает, почему он дает мне нулевой указатель?Существует больше кода, но я подумал, что было бы достаточно дать вам только то, что имеет отношение к делу.

Спасибо

Ответы [ 9 ]

3 голосов
/ 12 июля 2010

Попробуйте изменить это на:

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

Как я полагаю, вы где-нибудь обновите camObjCoord и установите его в null. В противном случае я не вижу, как вы могли бы получить исключение NullPointerException в этой строке.

3 голосов
/ 12 июля 2010

Вы уверены, что это исключение NullPointerException, а не ArrayIndexOutOfBoundsException? Если start != 0, то i - длина массива. Однако индексы массива работают от 0 до length - 1 - поэтому вам нужно i = Global.camObjCoord.length - 1;, чтобы получить действительный индекс в строке, которую вы утверждаете, выдает исключение.

2 голосов
/ 12 июля 2010

Обратите внимание, что эта строка может выдать исключение, если она выполняется до значения camObjCoord. Сложно вызвать такую ​​ситуацию, но это возможно (например, если предыдущий инициализатор содержит вызов метода и вы получаете доступ к camObjCoord внутри этого метода):

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

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

Обратите внимание, что добавление final к определению поля не решает эту проблему (это означает, что вы можете наблюдать 2 различных значения для поля final во время выполнения: null и фактическое значение!).

2 голосов
/ 12 июля 2010

Максимальный индекс массива должен быть array.length - 1. Итак

if(start != 0){
        i = Global.camObjCoord.length - 1;
    } 
1 голос
/ 12 июля 2010

Учитывая код, который вы показываете, не может быть исключения NullPointerException. Либо исключение возникает в другой строке, либо это другое исключение, либо вы устанавливаете массив в null где-то еще.

0 голосов
/ 12 июля 2010

Как уже указывал inflagranti - способ получить настоящий NPE only - это установить 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.
0 голосов
/ 12 июля 2010

Вы должны опубликовать трассировку стека, потому что я считаю, что это не NullPointerException, а ArrayIndexOutOfBoundsException. Если вы установите i = Global.camObjCoord.length, то вы не сможете индексировать массив, используя i, так как он будет за пределами массива. Подумайте об этом, если у вас есть массив размером 1, то единственный индекс, который вы можете использовать, это 0, если вы попытаетесь получить доступ к элементу 1, вы окажетесь за пределами массива и, следовательно, получите исключение.

0 голосов
/ 12 июля 2010

Я думаю, что когда вы используете 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 и посмотреть, выходит ли оно за пределы массива.

Надеюсь, я помог.

0 голосов
/ 12 июля 2010

Вы присваиваете i = array.length, а затем присваиваете элемент в i.Это будет доступ к концу массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...