Java JPA/SAX处理程序事件/for循环未运行
我将7464个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,
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.");
}
}