1

我希望我能正确解释这一点。我正在使用 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空。当它们被添加到地图时,我无法进一步进入代码以查看异常被抛出的位置,没有堆栈跟踪,没有任何文件/行号显示在任何地方以解释异常的位置或什至是如何抛出的。

从对 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)  
4

1 回答 1

3

这个 Javolution 库可能没有正确编译,在编译时没有参数-gjavac可能会导致输出 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();
    }
}

这里有类似的例子。你可以在这里挖掘得更深一些。

于 2013-01-15T11:39:09.763 回答