我有7,464个siteID
整数存储在同名(List
)的siteID
中。我遍历列表,并使用每个siteID
整数与JPA
查询SQL表以返回SiteTable
实例并获取其postcode
字符串。
然后,我使用这些postcode
字符串检查XML文件以针对每个postcode
检索纬度和经度值。下面是循环;
for (Integer id : siteID){
siteTable = em.find(SiteTable.class, id);
XMLPositionRetriever.runXMLQuery(siteTable.getPostcode());
}
然后将该邮政编码字符串放入下面的类的
runXMLQuery(String toFind)
方法中;public class XMLPositionRetriever extends DefaultHandler{
String postcodeToFind;
boolean found = false;
public XMLPositionRetriever(){
}
public XMLPositionRetriever(String toFind){
postcodeToFind = toFind;
}
public static void runXMLQuery(String toFind){
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
XMLPositionRetriever handler = new XMLPositionRetriever(toFind);
saxParser.parse("src\\haldata\\postcodes"+toFind.charAt(0)+".xml", handler);
}
catch(Exception e){
System.out.println(e);
}
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (postcodeToFind.equals(attributes.getValue("postcode"))){
System.out.println("The postcode '"+postcodeToFind+"', has a latitude of "+attributes.getValue("latitude")+" and a longitude of "+attributes.getValue("longitude"));
found = true;
}
}
@Override
public void endDocument(){
if(!found){
System.out.println("Not Found");
}
}
}
上面的事件处理程序可确保即使在任何XML文件中均未找到
postcode
或存在异常,也始终会输出某些内容。因此,我期望的是上面的代码println
7464次,但是我却得到了50条左右的输出。看来循环实际上并没有为每个siteID
运行,但是代码表明应该如此。我将问题缩小到上面显示的代码(很可能在循环本身中),但是现在看不到任何错误。有什么建议么?XML看起来像这样,但最多包含300,000个入口元素。
<?xml version="1.0"?>
<postcodes>
<entry postcode='AB1 0AA' latitude='7.101478' longitude='2.242852' />
</postcodes>
抱歉在您所有人上转储了这么多代码,但是我认为我可以用更少的钱给您提供完整的信息。
最佳答案
出现问题(在下面,有注释);
for (Integer id : siteID){
siteTable = em.find(SiteTable.class, id);
XMLPositionRetriever.runXMLQuery(siteTable.getPostcode());// <--- Null point exception on this line.
}
在
em.find()
找不到Entity
类的地方,它返回null。在这种情况下,siteTable.getPostcode()
会抛出NullPointerException
。因此,我添加了一个if语句,以防止对该语句进行空引用(以及添加其他一些条件来整理XML搜索)。for (Integer id : siteID){
site = em.find(SiteTable.class, id);
if(site != null && site.getPostcode() != null && !site.getPostcode().equals("")){
XMLPositionRetriever.runXMLQuery(site.getPostcode());
}
else{
System.out.println("The site and/or postcode against this Instruction does not exist.");
}
}
谢谢MarioP,没有他我可能不会明白。