2013-01-15 2 views
1

올바르게 설명 할 수 있기를 바랍니다. Javolution 라이브러리를 사용하여 XML 구성 파일을 읽고 쓰는 중입니다. XMLStreamReader/Writer를 사용하고 있습니다. 독서 중 태그를 읽고 LinkedHashMap에 속성을 저장하려고합니다. 그러나 예외가 발생했습니다. 즉, throw 될 때와 현재 코드에서 진행중인 사항 때문에 의미가 없어 보입니다.제 3 자 라이브러리에 의해 예외가 발생했습니다.

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 널이다. 맵에 추가 될 때 예외가 던져지는 곳을보기 위해 코드를 한 단계 더 나아갈 수 없으며 스택 추적도없고 어디에서 또는 예외가 발생하는지 설명하기 위해 아무 곳에 나 표시되는 파일/행 번호가 없습니다.

Javolution의 이전 구현에 대한 빠른 Google 검색에서이 특정 예외는 XMLStreamWriterImpl 유형의 몇 가지 메소드를 사용하여 던집니다. 나는이 메소드들을 사용할 때마다 중단 점을 설정했다. 그러나 디버거는 코드의 후반부에서 사용될 때까지 디버거를 사용하지 않는다 (그리고 localName 변수는 선언시 초기화된다).

아무에게도이 예외가 throw되는 이유를 알 수있는 방법에 대한 조언이 있습니까?

스택 추적 :

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

show stacktrace – Archer

+0

이 XLStream 판독기에서 유효성 검사가 활성화되어 있습니까? XML이 XSD를 준수합니까? – NiranjanBhat

+1

[Eclipse에서 예외에 대한 중단 점]을 만들 수 있습니다 (http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference%2Fviews%2Fbreakpoints%2Fref-addexception_viewaction .htm) –

답변

2

그것은 아마도 javac를 통해 컴파일 할 때이 Javolution 라이브러리가 제대로 인수 -g하지 않고, 컴파일되지 것이 가능하고이 디버그 정보의 출력 항아리 부족을 만들 것입니다. 현재 작업하고있는 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.

+0

위대하고 매우 유용합니다. VisualVM 용 플러그인을 다운로드하고 위의 스크립트를 사용했습니다. 그러나, 어떤 이유로 그것은 매우 이상한 예외를 잡을 수 없습니다. (스크립트가 아니라 NullPointerException을 변경하면 catch하지만 Eclipse도 마찬가지입니다). XMLStreamException이 던져지는 방식은 매우 이상합니다. 그냥 아무렇게나 던져진 것 같습니다. BTrace를 잡는 데 문제가 있다면 소스 코드를 다운로드하지 않았다는 것인가 궁금합니다. 그것을 시도 할 것입니다. 어느 쪽이든, 이것은 확실히 계속 사용하는 훌륭한 도구입니다. – MeanwhileInHell

+0

@NomNomNom 그렇다면 XMLStreamException이 생겨서 몇 가지 중요한 변수의 런타임 값, 예를 들어 'Local'을 계산할 때 코드 라인 이전의 다른 이벤트를 잡을 수 있습니다. 아마도 그들은 퍼즐을 푸는 데 도움을 줄 것입니다. 소스 코드에 따라이 작업을 수행해야 할 수 있으며 소스 코드를 사용할 수없는 경우 디 컴파일이 필요합니다. –

관련 문제