求救:一个遍历XML的程序,竟然出现无限递归,导致StackOverflowError。我觉得算法没有问题!难道Java API 有bug?

foobarfoobar 2007-09-18 11:07:05
求救:一个遍历XML的程序,竟然出现无限递归,导致StackOverflowError。我觉得算法没有问题!难道Java API 有bug?

XML 片段 如下:(说明:每个节点自身,都有name和value属性。value熟悉肯定没有重复,因为已经在数据库中验证过。)

<?xml version="1.0" encoding="UTF-8" ?>
<category-config>
<first-level name="Transportation" value="2700000000">
<second-level name="Aviation" value="2701000000"/>
<second-level name="Logistics" value="2708000000"/>
</first-level>
<first-level name="Others" value="2900000000">
<second-level name="Others" value="2901000000"/>
</first-level>
</category-config>

程序的思路:根据传递进来的一个节点,及需要找的 value 值,在该节点所代表的子树中找 value 值能匹配的节点。如当前节点匹配,则递归结束,否则,对每个子节点,调用自己。调用结束是,用返回值是否为null表示在当前子树中是否找到(null表示未找到)

该代码如下:
private String recursiveGetNameByValue( Element element, String value) {
// Element 的全类名: org.w3c.dom.Element
String result = null;

if (element.getAttribute("value").equals(value)) {
result = element.getAttribute("name");
return result;
}

NodeList childNodeList = element.getChildNodes();
int size = childNodeList.getLength();
for (int i = 0; i < size; i++) {
if (childNodeList.item(i).getNodeType() == Node.ELEMENT_NODE) {
Element curElement = (Element) childNodeList.item(i);
result = recursiveGetNameByValue(curElement, value); // 此处为递归
if (result != null) {
break;
}
}
} // End of for Loop
return result;
}

这段代码运行了大半年,一直没有出现问题。XML也有一个多月没动过(整个XML在浏览器中显示完全正常,任何节点都可以展开、收缩)。非常奇怪!

报错的片段:(CategoryFactory是上面的方法所在的类名)
java.lang.StackOverflowError
at org.apache.xerces.dom.NamedNodeMapImpl.findNamePoint(Unknown Source)
at org.apache.xerces.dom.NamedNodeMapImpl.getNamedItem(Unknown Source)
at org.apache.xerces.dom.ElementImpl.getAttribute(Unknown Source)
at com.Mycomp.CategoryFactory.recursiveGetNameByValue(CategoryFactory.java:477)
at com.Mycomp.CategoryFactory.recursiveGetNameByValue(CategoryFactory.java:489)
at com.Mycomp.CategoryFactory.recursiveGetNameByValue(CategoryFactory.java:489)
at com.Mycomp.CategoryFactory.recursiveGetNameByValue(CategoryFactory.java:489)
at com.Mycomp.CategoryFactory.recursiveGetNameByValue(CategoryFactory.java:489)
at com.Mycomp.CategoryFactory.recursiveGetNameByValue(CategoryFactory.java:489)
at com.Mycomp.CategoryFactory.recursiveGetNameByValue(CategoryFactory.java:489)
at com.Mycomp.CategoryFactory.recursiveGetNameByValue(CategoryFactory.java:489)
at com.Mycomp.CategoryFactory.recursiveGetNameByValue(CategoryFactory.java:489)
at com.Mycomp.CategoryFactory.recursiveGetNameByValue(CategoryFactory.java:489)
at com.Mycomp.CategoryFactory.recursiveGetNameByValue(CategoryFactory.java:489)
at com.Mycomp.CategoryFactory.recursiveGetNameByValue(CategoryFactory.java:489)

...全文
291 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
foobarfoobar 2007-09-21
  • 打赏
  • 举报
回复
未解决。算了。换其他方法吧。
foobarfoobar 2007-09-20
  • 打赏
  • 举报
回复
我们在公司内的服务器上反复做了测试,模拟了40个用户,产生了1G的Log。仔细看Log(将近1亿行),每次调用都在期望的次数内(按照期望的次序)正常结束,也没有出现 StackOverflowError。
foobarfoobar 2007-09-18
  • 打赏
  • 举报
回复
非常感谢您的回答。 XML的层次不深,最多3层。 可能算比较宽的,大概800多个节点。
但我就是不明白怎么会出现无限递归呢?

xpath还是头次听说 (// 不好意思)
zhmt 2007-09-18
  • 打赏
  • 举报
回复
你的代码看起来好像没问题
只是 xml树的层次很深,树很大的话,递归的层次就深了
就有可能堆栈溢出.
zhmt 2007-09-18
  • 打赏
  • 举报
回复
为什么不用xpath呢
zjf405 2007-09-18
  • 打赏
  • 举报
回复
路过,up
freedom2001 2007-09-18
  • 打赏
  • 举报
回复
既然不是每次都出现,就加个日志跟踪吧,每次正常进入就把以前的日志清了,只记录当前遍历XML的情况,以后出问题就看下日志分析一下吧。这样直接看也不太好说
foobarfoobar 2007-09-18
  • 打赏
  • 举报
回复
说得是啊。不过,这个问题不是每次都出现,在我们自己的电脑上调试,一直都没问题 :(

而且这段代码在网站上运行了大半年(放上去之前当然测试过),一直没有出现问题(各种value的name都显示正常)。所以才觉得很奇怪。
bushuang 2007-09-18
  • 打赏
  • 举报
回复
你调试一下不就知道了吗
foobarfoobar 2007-09-18
  • 打赏
  • 举报
回复
递归的层次最多也只有3层啊。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧