Android, исключение нулевого указателя на данные, которые не равны нулю - PullRequest
0 голосов
/ 11 марта 2011

Я пишу приложение для Android, которое должно анализировать данные из файла XML. Я никогда не сталкивался с такой ошибкой, которую так сложно отследить. Или, может быть, мой мозг просто перестал работать. Что происходит. XML-файл имеет форму:

<?xml version="1.0" encoding="iso-8859-1"?>
<memberRoster>
    <agent>
        <agentInfo1>...</agentInfo1>
        <agentInfo2>...</agentInfo2>
        ...
    </agent>
    <agent>
        ...
    </agent>
    ...
</memberRoster>

Пока все работает хорошо, за исключением некоторых случайных кусочков веселья!

Время от времени он генерирует исключение NullPointerException. Я еще немного покопался и обнаружил, что есть ТРИ «агента» (из 800) с «якобы» нулевыми данными. Я проверил файл XML, и есть ли там данные, нет никаких недопустимых символов и т. Д. Это одни и те же три «агента» каждый раз. Программа анализирует другие записи до и после этих «нулевых» «агентов». Также следует отметить, что не все поля «agentInfo» в ArrayList имеют значение null; Например, одна из записей имеет 7 из 8 записей как ноль, с восьмой ненулевой, другая имеет только один ноль с последними 7 ненулевыми.

Я анализирую данные в ArrayList из файла XML, и, как я упоминал ранее, он работает без сбоев, пока не дойдет до этих трех конкретных записей в файле XML.

Извините, я не могу дать гораздо больше информации, эти данные чувствительны к нашим членам.

EDIT:

Извини! Я знал, что я что-то забыл! :)

Некоторый код из моего класса XMLHandler.java:

public void characters(char[] ch, int start, int length) </p> <pre><code> if(this.in_mr_agentNrdsId) { agent[0] = ch.toString(); } else if(this.in_mr_agentFirstName) { agent[1] = ch.toString(); } else if(this.in_mr_agentLastName) { agent[2] = ch.toString(); } else if(this.in_mr_agentPhone) { agent[3] = ch.toString(); } else if(this.in_mr_agentEmail) { agent[4] = ch.toString(); } else if(this.in_mr_agentOfficeName) { agent[5] = ch.toString(); } else if(this.in_mr_agentOfficePhone) { agent[6] = ch.toString(); } else if(this.in_mr_agentType) { agent[7] = ch.toString(); pds.setMemberRoster(agent); agent = new String[8]; }

PDS - это объект типа ParsedDataSet, который представляет собой простой класс, содержащий объекты ArrayList и несколько методов получения и установки:

public class ParsedDataSet { private ArrayList agentOpenHouses = new ArrayList(); private ArrayList calendarOfEvents = new ArrayList(); private ArrayList latestStatistics = new ArrayList(); private ArrayList memberRoster = new ArrayList();</p> <pre><code>public ArrayList<String[]> getAgentOpenHouses() { return agentOpenHouses; } public ArrayList<String[]> getCalendarOfEvents() { return calendarOfEvents; } public ArrayList<String[]> getLatestStatistics() { return latestStatistics; } public ArrayList<String[]> getMemberRoster() { return memberRoster; } public void setAgentOpenHouses(String[] agentOpenHousesItem) { this.agentOpenHouses.add(agentOpenHousesItem); } public void setCalendarOfEvents(String[] calendarOfEventsItem) { this.calendarOfEvents.add(calendarOfEventsItem); } public void setLatestStatistics(String[] latestStatisticsItem) { this.latestStatistics.add(latestStatisticsItem); } public void setMemberRoster(String[] memberRosterItem) { this.memberRoster.add(memberRosterItem); }

} // конец класса ParsedDataSet

Ответы [ 2 ]

1 голос
/ 11 марта 2011

Вы можете добавить оператор if в свои назначения и переназначить любые перехваченные 'NULL' или пустые строки в нулевое значение или просто переназначить переменную = "" в своем коде.

Например:

if (agentInfo1 == NULL) {
    agentInfo1 = "" || agentInfo1 = 0; //Depending on what your variables are
}
0 голосов
/ 11 марта 2011

Попробуйте вставить цикл try catch в код, чтобы определить, где происходит ошибка, затем точно определить точную часть кода, которая выдает эту ошибку, перед выполнением выполните нулевые проверки. Это основано на лучших практиках разработки программного обеспечения, а не на исправлении для вас.

В качестве альтернативы, вы можете убедиться, что на стороне сервера нет «нулевых» значений, возможно, указав фиктивное значение, например «EMPTY_STRING». Это особенно актуально, если ваше приложение уже отправлено, и вы не можете вносить какие-либо изменения в код клиента.

...