Java, Digester: застрял на этом java.lang.NullPointerException

Я анализирую файл XML с помощью Commons Digester и не понимаю, что не так в моем коде: я застрял с этим java.lang.NullPointerException.

ЭТО код: http://pastie.org/1708374

и это исключение: http://pastie.org/1708371

Я думаю, это глупая ошибка

Спасибо


person aneuryzm    schedule 24.03.2011    source источник


Ответы (2)


Ну, это проблема:

if (centroids.length == 0)

Насколько я вижу, вы никогда не присваиваете значение centroids, поэтому оно всегда будет нулевым. Затем, когда вы попытаетесь разыменовать его в строке выше, он выдаст NullPointerException.

Первое, что следующая строка кода пытается использовать centroids[0], предполагает, что вы не совсем понимаете массивы Java. Возможно, вы действительно хотели List какого-нибудь описания?

Я бы также настоятельно предложил вместо Map<String, String>, который всегда имеет одни и те же пять ключей, создать тип (например, Centroid), у которого есть свойства title, description, tags, time и event. Тогда вы можете просто сделать centroids List<Centroid>:

List<Centroid> centroids = new ArrayList<Centroid>();

потом, когда вы получите некоторые данные...

Centroid centroid = new Centroid(...);
centroids.add(centroid);

О, и вы также в настоящее время используете == для сравнения строк... не делайте этого: используйте equals, иначе вы будете сравнивать строки ссылки.

person Jon Skeet    schedule 24.03.2011

В качестве общего примечания о том, как читать трассировку стека NPE:

Когда вы получите трассировку стека исключений, посмотрите на строку Caused by и первую строку после нее.

Caused by: java.lang.NullPointerException
  at CentroidGenerator.nextItem2(CentroidGenerator.java:31)

Исключение нулевого указателя чаще всего возникает, когда вы пытаетесь вызвать метод для объекта, а этот объект имеет значение null. Сообщение об ошибке выше говорит вам, что ошибка возникает в строке 31 CentroidGenerator.java:

if (centroids.length == 0) {

Вызов метода имеет формат object.method, так что вы знаете, что в этом случае объект, который имеет значение null, является центроидом.

Быстрый визуальный способ определить, что является нулевым, — просто посмотреть, что находится слева от точек в строке, где возникает исключение. В строках, где у вас есть вызовы нескольких методов, вы не сразу знаете, какой объект имеет значение null, и вам может потребоваться дополнительное исследование, но не в этом случае.

Чтобы решить проблему, обратитесь к ответу Джона.

person JRL    schedule 24.03.2011