2013-04-28 4 views
0

Давным-давно, я получил код от своего бывшего коллеги, который работал на него, но я не могу заставить его работать.NullPointerException в классе карты

Используя отладчик, я сделал вывод, что мой класс имеет точку останова в этом методе:

((Map<String, List<byte[]>>)metaData).put(HEADERELEMENTS, headerOMElements); 

put метод имеет декларацию - String key, List <byte[]> value. Я также пробовал с

((Map<String, List<byte]>>)metaData).put("HEADERELEMENTS",headerOMElements); 

Но это такая же ситуация. Мой printStackTrace возвращает NullPointerException. я вырубку headerElements

number of headerOMElements (headerOMElements.size();)=1 
headers are(before calling the method PUT) (headerOMElements.toString();): [[[email protected]] 

Как сделать вывод, что это проблема и для ее решения? Я не высокоуровневый Java-эксперт, поэтому мне действительно нужна помощь.

+0

- это ваша метаданные Карта null? – duffy356

+0

Проблема заключается в том, что какой-то внешний класс определяет метаданные и вызывает основной метод этого класса. Вы хотите проверить его с помощью метода isEmpty или размера? –

+0

при отладке проверить metaData перед metaData.put (...) – duffy356

ответ

3

на основе ограниченной информации, которую вы предоставили, и при условии, что она является точной, единственно возможным путем что NullPointerException может быть брошен в этот момент, если metaData является null.

Итак ...

Измените код, чтобы распечатать значение metaDataнепосредственно перед в заявлении, где вы уверены, что NPE выбрасывают; например

System.err.println("metaData is " + metaData); 

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

Если результат показывает, что metaData НЕ null, то один из фактов/предположений, которые вы указали в своем вопросе, должен быть неверным. Для уточнения диагноза, мы должны были бы:

  • реальный код, копировать и вставлять (не набрано, как вы, кажется, сделали ... на основе опечаток), и
  • полная стек след.

1 - Для некоторых видов Map вы можете также получить NPE, если ключ был null. Однако это исключение будет вызвано в вызове метода put(). И кроме того, вы говорите, что у вас такая же проблема, когда вы используете буквенную строку в качестве ключа. Так что это не может быть объяснением.Единственное возможное объяснение заключается в том, что существует несколько потоков, обновляющих карту без синхронизации. Это может дать NPE (случайным образом), но NPE будет в put или каком-либо другом методе экземпляра Map.

+0

спасибо Стивен ... да, это вернуло мне, что metaData имеет значение null. Но я инициирую его в каком-то другом классе. Возможно, какой-то другой класс также инициирует его позади, потому что это какое-то приложение IBM с множеством классов по умолчанию. Есть ли способ, который я могу каким-то образом выяснить, какой класс инициирует, а также назвать этот мой дополнительный класс? спасибо –

+0

Единственный способ узнать это - прочитать код и проследить через вызовы в том месте, где этот «нуль» начинает свою жизнь. –

+0

metaData объявляется в определении метода. Поэтому я предполагаю, что с какого-то места (какой-то другой класс, который я притворяюсь, чтобы найти) этот метод называется. Каким будет метод для поиска назад, чтобы найти класс, который вызывает этот метод этого класса? Некоторые подсказки, пожалуйста, ярлык, чтобы вернуть меня к классу, который вызывает это? (В системе есть около 10000 классов, поэтому их трудно найти) В то время как я отметил ваш ответ как ответ –

1

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

OR Исключение выброшено где-либо еще.

+0

metaData - null. Я не могу найти место, где он установлен. В этом методе он просто вызывается, и он находится в объявлении метода –

+0

hmm .. вы также можете создать новый объект Map для ссылки, если он равен null. – duffy356

+0

Как создать новый экземпляр метаданных? это правильное выражение Map metaData = new HashMap (); потому что я смущен из-за этого выражения: (Map >) metaData –

Смежные вопросы