2013-06-11 27 views
9

Tôi nhận NullPointerException trong đoạn mã sau:Bắt NullPointerException trong khi chuyển yếu tố Dom chuỗi

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

Các stacktrace là:

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 

Tôi đã kiểm tra đường dẫn sau: http://geekymeeky.blogspot.in/2008/10/javaxxmltransform-transformerexception.html

Bài viết trên cho biết, nếu một nút văn bản là null thì ngoại lệ này xảy ra.

Tôi muốn biết, giá trị của biến số str làm cho giá trị nút văn bản thành null và dẫn đến ngoại lệ này.

+0

Và 'SOME_HTML_STRING' là gì? – fge

+0

Bạn có chắc 'nút' không phải là null không? Hãy thử thêm 'nút assert! = Null' trước khi chuyển đổi. – user1516873

+0

@fge Đó là điều tôi muốn biết. Trên thực tế, một trong những khách hàng của chúng tôi đã báo cáo lỗi này. Tôi đã thử mọi kịch bản có thể có của 'SOME_HTML_STRING', nhưng tôi không thể tạo lại lỗi. –

Trả lời

10

Như bạn có thể thấy trong theo dõi ngăn xếp, Ngoại lệ được ném khi trình phân tích cú pháp cố gắng phân tích cú pháp một số sai số processing instruction.

Bạn có thể dễ dàng tái tạo nó với mã bên dưới:

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

những gì đặt ra ngoại lệ gần giống như bạn.

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:

ngoại lệ tương tự xảy ra khi bạn nhận được nhận xét trống hoặc textNodes, ví dụ:

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


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

Nó không phải là tình trạng phổ biến, và có thể chỉ nếu không chính xác/hỏng xml được chuyển thành nguồn đầu vào.

+0

Cảm ơn rất nhiều vì câu trả lời. Một điều nữa, tôi muốn hỏi bạn rằng đây có phải là điều kiện duy nhất cho sự xuất hiện của ngoại lệ này hay không. Tôi chỉ muốn chắc chắn rằng sau khi sửa lỗi này, tôi sẽ không loại trừ ngoại lệ này trong một trường hợp khác. –

+0

@DheerajKumarAggarwal xem chỉnh sửa – user1516873

+0

Cảm ơn bạn rất nhiều vì đã hiển thị giải pháp cho lỗi của tôi. Đặt giá trị văn bản thành 'null' để ném một ngoại lệ nếu nó không được phép! – Hidde

Các vấn đề liên quan