Наиболее распространенная причина появления “java.lang.NullPointerException” при работе с XML-файлами?
Вопрос
Моя самая сильная зацепка заключается в том, что код, который обрабатывает входящие XML-файлы, на самом деле получает недопустимый / неполный файл, следовательно, не проходит синтаксический анализ DOM.Есть какие-нибудь предложения?
Решение
Неполный файл - это определенно то место, с которого стоит начать поиск.Я бы распечатал файл непосредственно перед тем, как вы его проанализируете, чтобы посмотреть, что отправляется в анализатор.Если она неполная, это будет очевидно.Если он недействителен, вам придется немного поискать.
Другие советы
Мое первое предположение состояло бы в том, что код, использующий DOM, обрабатывает элементы, помеченные в DTD как необязательные, как обязательные.
Отредактировано для добавления:Я имею в виду, что если вы не проверите на соответствие DTD, вы не можете ожидать, что что-то вроде следующего (пример использования dom4j) вернет что угодно, кроме null.
doc.selectSingleNode("//some/element/in/a/structure");
То же самое, конечно, верно, если вы объединяете вызовы навигации по элементам вместе или обычно не проверяете возвращаемые значения перед их использованием.
У вас должна быть трассировка стека, указывающая на то, куда выбрасывается ваш NPE.Это должно сузить количество переменных, которые могут иметь значение null.Вместо того чтобы вызывать отладчик или printf, я предлагаю добавить соответствующие проверки и выдавать исключение, как только ошибка может быть обнаружена.Это хорошая привычка, которой нужно овладеть, чтобы избежать загадочных проблем позже.
В идеале вы должны запускать свое java-приложение внутри отладчика, таким образом, при возникновении неперехваченного исключения вы можете изучить callstack, переменные и т.д. И точно увидеть, какая строка вызвала сбой, и, возможно, какие данные являются null, которые были использованы.
Если вы по какой-либо причине не можете использовать отладчик, скомпилируйте свое приложение с поддержкой отладки, добавьте обработчик исключений для этой конкретной ошибки и распечатайте трассировку стека.Опять же, это точно покажет, какая строка в каком файле вызвала сбой.