Java JPA/SAX处理程序事件/for循环未运行

Java JPA/SAX处理程序事件/for循环未运行,java,xml,jpa,for-loop,xml-parsing,Java,Xml,Jpa,For Loop,Xml Parsing,我将7464个siteID整数存储在一个列表中,并使用相同的名称(siteID)。我在列表中循环,使用每个siteID整数查询带有JPA的SQL表,以返回SiteTable实例并获取其postcode字符串 然后,我使用这些postcode字符串检查XML文件,以根据每个postcode检索纬度和经度值。下面是循环 for (Integer id : siteID){ siteTable = em.find(SiteTable.class,

我将7464个
siteID
整数存储在一个
列表
中,并使用相同的名称(
siteID
)。我在列表中循环,使用每个
siteID
整数查询带有
JPA
的SQL表,以返回
SiteTable
实例并获取其
postcode
字符串

然后,我使用这些
postcode
字符串检查XML文件,以根据每个
postcode
检索纬度和经度值。下面是循环

for (Integer id : siteID){           
                siteTable = em.find(SiteTable.class, id);
                XMLPositionRetriever.runXMLQuery(siteTable.getPostcode());         
        }
然后将该邮政编码字符串放入下面类中的
runXMLQuery(stringtofind)
方法中

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文件中找不到
邮政编码
,或者即使存在异常,也始终输出某些内容。因此,我希望上面的代码能够打印7464次,但我得到的是50行左右的输出。似乎每个
siteID
都没有实际运行循环,但代码说应该运行循环。我已经将问题缩小到上面显示的代码(很可能是在循环本身中),但现在我看不到任何错误。有什么建议吗

XMLs看起来像这样,但有多达300000个条目元素

<?xml version="1.0"?>
<postcodes>
    <entry postcode='AB1 0AA' latitude='7.101478' longitude='2.242852' />
</postcodes>

很抱歉在你们身上扔了这么多代码,但我不认为我能用更少的代码给你们一个完整的画面。

问题发生了(下面,评论)

感谢马里奥普,没有他我可能无法解决问题。

问题出现了(下面,评论)


感谢MarioP,如果没有他,我可能无法找到答案。

更新:在运行for循环之前立即测试列表上的
siteID.size()
,显示7464。然而,循环只运行了56次(我添加了一个print语句来显示每个循环周期)。因此,问题似乎出在循环本身引发异常?多亏了编辑“超时”-另一个猜测:您是否尝试在
runXMLQuery
中捕获
Throwable
而不是
exception
?显然,EntityManager.find可以引发非法argumentException。我必须检查情况是否如此,但根据抛出该异常的标准判断,我不明白在这种情况下为什么会这样。我明天上班的时候得检查一下。抓到一次性垃圾会有什么不同?我很惭愧地说,在异常等方面,我的知识非常糟糕。
异常
扩展了
可丢弃性
——错误也是如此,所以可能您没有发现导致循环中断的错误。我看不到循环过早中断的任何其他方式。更新:在运行for循环之前立即测试列表上的
siteID.size()
,显示7464。然而,循环只运行了56次(我添加了一个print语句来显示每个循环周期)。因此,问题似乎出在循环本身引发异常?多亏了编辑“超时”-另一个猜测:您是否尝试在
runXMLQuery
中捕获
Throwable
而不是
exception
?显然,EntityManager.find可以引发非法argumentException。我必须检查情况是否如此,但根据抛出该异常的标准判断,我不明白在这种情况下为什么会这样。我明天上班的时候得检查一下。抓到一次性垃圾会有什么不同?我很惭愧地说,在异常等方面,我的知识非常糟糕。
异常
扩展了
可丢弃性
——错误也是如此,所以可能您没有发现导致循环中断的错误。我看不出有任何其他方式可以让循环过早中断。
for (Integer id : siteID){           
            siteTable = em.find(SiteTable.class, id);
            XMLPositionRetriever.runXMLQuery(siteTable.getPostcode());// <--- Null point exception on this line.       
    }   
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.");
       }
}