2011-03-11 68 views
0

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

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

到目前为止,它的工作很好,除了好玩一些随机位!

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

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

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

} // end class ParsedDataSet

+0

发布一些代码,以便我们可以提供帮助。 – yogsma 2011-03-11 18:16:17

+0

如果您发布用于检索和解析XML的代码,这将有所帮助 – Cameron 2011-03-11 18:17:40

+1

您可以从LogCat中提供堆栈跟踪,也可能是违规的代码片段? – 2011-03-11 18:17:44

回答

1

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

例如:

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

就是这样,ArrayList中的数据不应该为null。我真的没有理由想到为什么会这样,因为数据在XML文件中,程序能够正确解析99%的文件。这几乎就像编译器对这些特定代理有些东西;) – rollhax 2011-03-11 18:43:07

+0

代理字段中是否有特殊字符? 也正如nicholas hauschild所提到的,来自adb接口的logcat将确实有助于查明错误。 – Sorean 2011-03-11 19:00:35

+0

否定的,我已经删除了任何和所有特殊字符的服务器端,所以他们甚至不在XML文件中。此外,所讨论的ArrayList索引没有格式可以说,没有句点,逗号等等。我很快会给你一个logcat。 – rollhax 2011-03-11 19:12:13

0

尝试把尝试捕捉循环在代码中找到的地方发生错误的,那么,p对出现此错误的代码的确切部分进行了介绍,在继续之前做了空检查。这是基于软件开发的最佳实践,而不是为您解决。

或者,您可以确保在服务器端不存在“null”值,也许可以通过赋予像“EMPTY_STRING”这样的虚拟值。如果您的应用程序已发货并且无法进行任何客户端代码更改,则这一点尤其重要。

+0

我已经验证了服务器端的空检查已完成,并且XML文件中没有空字段 - 我用空白替换了任何“空”字段,除了上面提到的三个ArrayList索引之外,它们都很好。我正在发布一些代码。 – rollhax 2011-03-11 18:41:24