2013-06-11 8 views
9

otrzymuję NullPointerException w poniższym kodzie:Pierwsze NullPointerException podczas przekształcania elementu DOM ciąg

String str = SOME_HTML_STRING; 
Node node = convertStrIntoNodeUsingJTidy(); 
domToString(node); 

//converts node to string  
public static String domToString(org.w3c.dom.Node node)throws Exception { 
    try { 
     StringWriter sw = new StringWriter(); 
     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer transformer = tf.newTransformer(); 
     transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 

     // NullPointerException at this line, although node is not null 
     transformer.transform(new DOMSource(node), new StreamResult(sw)); 
     return sw.toString(); 
    } catch (Exception ex) { 
     throw new Exception("Error converting to String", ex); 
    } 
} 

StackTrace jest:

Caused by: javax.xml.transform.TransformerException: java.lang.NullPointerException 
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown Source) 
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown Source) 
at com.example.Util.domToString(Util.java:3179) 
... 128 more 
Caused by: java.lang.NullPointerException 
at com.sun.org.apache.xml.internal.serializer.ToXMLStream.processingInstruction(Unknown Source) 
at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.processingInstruction(Unknown Source) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown Source) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown Source) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown Source) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown Source) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown Source) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown Source) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(Unknown Source) 
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(Unknown Source) 
... 131 more 

już sprawdzone na poniższy link: http://geekymeeky.blogspot.in/2008/10/javaxxmltransform-transformerexception.html

Powyższy post mówi, że jeśli węzeł tekstowy ma wartość null, występuje ten wyjątek.

Chcę się dowiedzieć, jaka wartość zmiennej str spowodowała wartość węzła tekstowego na wartość null i doprowadziła do tego wyjątku.

+0

Co to jest "SOME_HTML_STRING"? – fge

+0

Czy jesteś pewien, że 'węzeł' nie ma wartości NULL? Przed transformowaniem spróbuj dodać 'assert node! = Null'. – user1516873

+0

@fge To jest to, co chcę wiedzieć. W rzeczywistości jeden z naszych klientów zgłosił ten błąd. Wypróbowałem każdy możliwy scenariusz "SOME_HTML_STRING", ale nie mogę odtworzyć błędu. –

Odpowiedz

10

Jak widać na wykresie stosu, wyjątek został rzucony, gdy analizator składniowy próbuje przetworzyć niepoprawne processing instruction.

można łatwo odtworzyć go z kodem poniżej:

Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 
    Node n = d.createProcessingInstruction("test", null); 
    System.out.println(domToString(n)); 

co podnosi wyjątek prawie jak twoja.

Caused by: javax.xml.transform.TransformerException: java.lang.NullPointerException 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:732) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:336) 
    at TestNode.domToString(TestNode.java:63) 
    ... 31 more 
Caused by: java.lang.NullPointerException 
    at com.sun.org.apache.xml.internal.serializer.ToXMLStream.processingInstruction(ToXMLStream.java:281) 
    at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.processingInstruction(ToUnknownStream.java:886) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:235) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:90) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:679) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:723) 
    ... 33 more 

EDIT:

Podobny wyjątek zdarzyć, gdy masz pustych komentarzy lub textNodes, na przykład:

Node n = d.createComment("test"); 
    n.setTextContent(null); // throws exception on parse 


    Node n = d.createTextNode(null); // throws exception on parse 

To nie jest powszechna sytuacja, i możliwe tylko wtedy, gdy nieprawidłowy/uszkodzony xml był passs jako źródło wejściowe.

+0

Wielkie dzięki za odpowiedź. Jeszcze jedno, chciałbym zapytać, czy jest to jedyny warunek wystąpienia tego wyjątku. Chcę tylko upewnić się, że po naprawieniu tego, nie otrzymam tego wyjątku ponownie w innym scenariuszu. –

+0

@DheerajKumarAggarwal patrz edytuj – user1516873

+0

Dziękuję bardzo za przedstawienie rozwiązania mojego błędu. Ustawienie wartości tekstowej na 'null' na powinno spowodować wyjątek, jeśli nie jest dozwolone! – Hidde

Powiązane problemy