我正在为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);
}
答案 0 :(得分:1)
您可以在您的分配中添加if语句,并将任何捕获的“NULL”或空字符串重新分配为零值,或者在代码中重新分配为变量=“”。
例如:
if (agentInfo1 == NULL) {
agentInfo1 = "" || agentInfo1 = 0; //Depending on what your variables are
}
答案 1 :(得分:0)
尝试在代码中放置try catch循环以查找错误发生的位置,然后确定发出此错误的代码的确切部分,在继续之前进行空检查。这是基于软件开发的最佳实践,而不是针对您的修复。
或者,您可以在服务器端确保没有“null”值,可能通过给出像“EMPTY_STRING”这样的虚拟值。如果您的应用程序已经发货且您无法更改任何客户端代码,则此功能尤为重要。