我有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,没有他我可能不会明白。

10-08 20:13