Android,Null指针异常数据非空

时间:2011-03-11 18:13:25

标签: android xml null nullpointerexception

我正在为android编写一个需要解析XML文件数据的应用程序。我从来没有遇到像这样的错误,这是非常难以追查的。或者也许我的大脑停止了工作。那个会发生。 XML文件的格式为:

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

到目前为止它运作良好,除了一些随意的乐趣!

每隔一段时间它就会抛出一个NullPointerException。我做了一些挖掘,发现有三个“代理”(800个中)有“假定”的空数据。我检查了XML文件,数据在那里,没有非法字符等。每次都是相同的三个“代理”。该程序解析这些“空”“代理”之前和之后的其他条目。另外值得注意的是,并非ArrayList中的所有“agentInfo”字段都为null;例如,其中一个条目将8个条目中的7个作为null,第8个条目为非null,另一个条目只有一个null,最后7个为非null。

我正在从XML文件中将数据解析为ArrayList,就像我之前提到的那样,它可以完美地运行,直到XML文件中的这三个特定条目为止。

对不起,我不能提供更多信息,数据对我们的会员很敏感。

编辑:

抱歉!我知道我忘记了什么! :)

我的XMLHandler.java类中的一些代码:

public void characters(char[] ch, int start, int length)

    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];
    }

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对象和一些getter和setter方法的简单类:

public class ParsedDataSet { private ArrayList agentOpenHouses = new ArrayList(); private ArrayList calendarOfEvents = new ArrayList(); private ArrayList latestStatistics = new ArrayList(); private ArrayList memberRoster = new ArrayList();

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);
}

2 个答案:

答案 0 :(得分:1)

您可以在您的分配中添加if语句,并将任何捕获的“NULL”或空字符串重新分配为零值,或者在代码中重新分配为变量=“”。

例如:

if (agentInfo1 == NULL) {
    agentInfo1 = "" || agentInfo1 = 0; //Depending on what your variables are
}

答案 1 :(得分:0)

尝试在代码中放置try catch循环以查找错误发生的位置,然后确定发出此错误的代码的确切部分,在继续之前进行空检查。这是基于软件开发的最佳实践,而不是针对您的修复。

或者,您可以在服务器端确保没有“null”值,可能通过给出像“EMPTY_STRING”这样的虚拟值。如果您的应用程序已经发货且您无法更改任何客户端代码,则此功能尤为重要。