查找第三方库引发的异常

时间:2013-01-15 10:51:10

标签: java eclipse exception javolution

我希望我能正确解释一下。我正在使用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

keyvalue都不为空。当它们被添加到地图中时,我无法进一步查看代码,以查看抛出异常的位置,没有堆栈跟踪,没有任何文件/行号显示在哪里,以解释抛出异常的位置,甚至抛出异常。< / 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)  

1 个答案:

答案 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();
    }
}

并且有类似的示例here。你可以深入挖掘here