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);
   }
}

キーと値が追加された直後に、thisJavolutionからの例外をキャッチします。

javolution.xml.stream.XMLStreamException: Local name cannot be null

どちらでもないkeyvalue、nullです。それらがマップに追加されているとき、例外がスローされている場所を確認するためにコードにさらに踏み込むことはできません。スタックトレースはなく、例外がスローされる場所や方法を説明するファイル/行番号はどこにも表示されません。

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 に答える