我希望我能正确解释一下。我正在使用Javolution库来读取和编写XML配置文件。我正在使用XMLStreamReader / Writer。在阅读期间,我正在寻找一个标签并将其属性存储在LinkedHashMap中。但是,我有一个异常被抛出,对我来说看起来毫无意义,因为它被抛出时以及代码中正在发生什么。
使用Eclipse调试器时,将属性的键和值添加到我的地图时会抛出异常。
public class Element {
private HashMap<String, String> attributes = new LinkedHashMap<String, String>();
...
public void setAttribute(String key, String value) {
...
attributes.put(key, value);
}
}
在添加键和值之后,this
从Javolution中捕获异常:
javolution.xml.stream.XMLStreamException: Local name cannot be null
key
或value
都不为空。当它们被添加到地图中时,我无法进一步查看代码,以查看抛出异常的位置,没有堆栈跟踪,没有任何文件/行号显示在哪里,以解释抛出异常的位置,甚至抛出异常。< / p>
通过快速谷歌搜索较旧的Javolution实现,我可以看到只使用XMLStreamWriterImpl类型的一些方法抛出此特定异常。我在每次使用这些方法时都设置了断点,但是调试器在代码的后期才会使用它们(并且我的localName变量在声明时初始化)。
对于我如何确定抛出此异常的原因,有人会有任何建议吗?
堆栈追踪:
Java HotSpot(TM) 64-Bit Server VM[localhost:3999]
Thread [main] (Suspended)
XMLImplMain$Element.setAttribute(String, String) line: 827
XMLImplMain.translate(Element) line: 133
XMLImplMain.translate(Element) line: 140
XMLImplMain.translate(Element) line: 140
XMLImplMain.loadXML(String) line: 118
Bootstrap.main(String[]) line: 32
Thread [EventWriter] (Running)
答案 0 :(得分:2)
这个Javolution库可能没有正确编译,在通过javac
进行编译时没有参数 -g ,这将使输出jar缺少调试信息。您可以找到当前正在处理的jar的相应源代码,并使用足够的参数重新编译它以使其可以自行调试。
或者,有一种解决方法更复杂,但不需要自定义编译,编写BTrace脚本并捕获所有XMLStreamException的初始化,然后打印出栈跟踪,如下所示:
package com.sun.btrace.samples;
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
@BTrace
public class OnThrow {
@OnMethod(clazz = "javolution.xml.stream.XMLStreamException", method = "<init>", location = @Location(Kind.RETURN))
public static void endMethod(@Self Exception self) {
jstack();
}
}