NullPointerException при простой проверке нуля в Java - PullRequest
0 голосов
/ 02 февраля 2011

Я получаю исключение NullPointerException в строке, в которой выполняется простая проверка на нулевое значение. Строка имеет следующий вид:

if(routingTable[commonBitGroups][nextNumberOfOther-1]==null)

Я проверяю, что массив не равен NULL непосредственно перед этой строкой.commonBitGroups и nextNumberOfOther являются простыми типами int.

Я должен добавить, что эта строка является частью приложения, которое использует rmi, и частью класса, который расширяет UnicastRemoteObject и реализует RemoteInterface. Я указываю это, потому что я нахожусь подСоздается впечатление, что NullPointerException может возникать, когда вы имеете дело с синхронизацией, даже если ничто не является действительно нулевым (возможно, когда что-то заблокировано), и я имею дело с синхронизацией в этом приложении. Метод, который содержит строку, хотя и не синхронизирован, и нигде в моем коде япопробуйте использовать массив в качестве монитора (у меня есть только некоторые синхронизированные методы, нет меньших синхронизированных блоков, поэтому я нигде не выбираю конкретный монитор явно).

Ответы [ 2 ]

2 голосов
/ 02 февраля 2011

Если следующая строка выбрасывает NPE:

if (routingTable[commonBitGroups][nextNumberOfOther - 1] == null)

, то либо routingTable равно null, либо routingTable[commonBitGroups] равно null.


Вы говорите, чтомассив инициализируется следующим образом:

routingTable = new NodeId [32][15]; 
Arrays.fill(routingTable, null);

«Ну, вот в чем ваша проблема!»

Первая строка дает вам массив из 32 NodeId [], с элементами, инициализированными для non-null значения ... массивы размера 15. (Пока все хорошо ...)

Вторая строка устанавливает routingTable[i] в null для всех i .... Ooops !!

Удалить вторую строку.

1 голос
/ 02 февраля 2011

Как говорит @Gabe, вероятно, что routingTable [commonBitGroups] имеет значение null.В Java нет реальных многомерных массивов: двумерный массив - это массив массивов (а трехмерный массив - это массив массивов массивов).

Кстати, вам не нужно инициализировать ссылки вмассив к нулю в Java, это их значение по умолчанию.В этом случае это тоже ваша проблема.Вы устанавливаете второй уровень значений массива на ноль.То, что вы имели в виду, было

for (int i = 0; i < 32; i++) {
    Arrays.fill(routingTable[i], null);
}

Но, как указано выше, это не нужно.Так что просто удалите ваш звонок на Arrays.fill.

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