Нулевой указатель при перемещении данных - PullRequest
1 голос
/ 17 августа 2010

У меня есть функция, заполняющая HashMap (rMap) массивов String. Как только определенные условия выполнены, например, r.Map.size() != 0 I, в другом файле (rMap - глобальная переменная) вызовите следующую String array[] = rMap.get(0) из этой попытки I System.out.println(array[0]).

Это запуск программы, и я получаю нулевой указатель на System.out.println(array[0]);. У кого-нибудь есть идеи, почему это происходит?

РЕДАКТИРОВАТЬ: я заполняю карту так ..

String center[] = new String[] { tname, tmessage, tlink, tsname };
Global.rMap.put(index, center);

Где все значения в массиве являются переменными, которые являются строками. Таким образом, значение, к которому я обращаюсь tname и не равно нулю. Я проверил Значение моего ключа - строка

Ответы [ 6 ]

1 голос
/ 17 августа 2010

Ссылка array является нулевой, скорее всего потому, что в rMap не было добавлено значение (или null) с ключом 0.

Если возможно, используйте обобщенные значения, чтобы убедиться, что ваши ключи имеют правильный тип. Вы также можете распечатать значения карты до получения array, чтобы увидеть, что находится на карте. Выполнение кода с помощью отладчика с часами на rMap также покажет, что содержит карта и когда она изменяется.

1 голос
/ 17 августа 2010

Как вы заполняете карту? Вы уверены, что вводите ненулевую запись с ключом Integer, равным 0?

Ну, мы можем быть уверены, что это не так. Возможные причины:

  • Ошибка в коде заполнения, которая приводит к тому, что предполагаемый пут не выполняется или с другим значением ключа
  • Вы используете Short или Byte объекты в качестве ключей
  • Вы помещаете null значение на карту под ключом 0

Вы можете сами ответить на этот вопрос, запустив код в отладчике и просмотрев содержимое карты.

Обновление:

Значение моего ключа - строка

Ну, вот твоя проблема. rMap.get(0) будет искать Integer и не будет соответствовать записи для строки "0".

0 голосов
/ 17 августа 2010

Это проблема, когда вы вызываете метод get реализации Map, сигнатурой метода get java.util.Map является get (java.lang.Object), таким образом, любой объект будет принят в качестве аргумента.

Ключ, который работает нормально, это либо передача строки (значение = 0) в качестве ключа, либо переопределение метода hashCode и равен методам объекта аргумента, который не является объектом java.lang.String.

0 голосов
/ 17 августа 2010

Попробуйте rMap.get (Integer.valueOf (0));

0 голосов
/ 17 августа 2010

Метод get () Hashmap использует ключ, а не индекс, чтобы определить значение, которое вы хотите получить.Если вы хотите упорядоченный список элементов, вам нужно использовать подкласс List (или принудительно упорядочить, yaourself).Если вы хотите использовать Hashmap, используйте метод keys () для получения перечисления всех ключей карты.

(удалено над текстом из-за уточнения вопроса. Оставляя текст ниже как, даже еслиэто не проблема, это важное соображение)

Кроме того, вам нужно быть очень осторожным, чтобы не создавать условия гонки, поскольку вы работаете между потоками.В то время как собственный Hashtable Java синхронизирован, это не означает, что данные в нем есть.То есть, вы можете MyObj obj = get (xxx) в одном htread, Nd начать манипулировать obj в двух отдельных потоках, возможно наступая друг на друга.В зависимости от вашего приложения вы можете захотеть использовать Hashtable.remove (), чтобы данные исчезли с карты и не могли быть использованы повторно, или вам могут потребоваться некоторые синхронизированные блоки (remove () вполне может быть более простой реализацией, однакоВы должны были бы изящно обрабатывать условия, когда карта сначала содержит данные, а затем эти данные исчезают).

0 голосов
/ 17 августа 2010

HashMap допускает нулевые значения, поэтому значение, которое вы получаете с помощью String array[] =rMap.get(0);, может быть нулевым. При доступе к нулевому массиву выдается NPE.

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