Java 将Dom元素转换为字符串时获取NullPointerException

Java 将Dom元素转换为字符串时获取NullPointerException,java,xml,Java,Xml,我在以下代码中获得NullPointerException: 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 { St

我在以下代码中获得NullPointerException:

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);
    }
}
堆栈跟踪是:

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
我已经检查了以下链接:

上面的帖子说,如果文本节点为null,则会发生此异常


我想知道,是什么变量str的值导致文本节点值为null并导致此异常。

正如您在堆栈跟踪中看到的,当解析器试图解析一些不正确的数据时抛出异常

您可以使用下面的代码轻松地复制它:

    Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
    Node n = d.createProcessingInstruction("test", null);
    System.out.println(domToString(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
编辑:

当您获得空注释或文本节点时,也会发生类似的异常,例如:

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


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

这不是常见的情况,只有当不正确/损坏的xml作为输入源传递时才可能出现。

什么是
某些HTML\u字符串
?您确定
节点
不为空吗?尝试添加
断言节点!=转换前为null
。@fge这就是我想知道的。实际上,我们的一位客户报告了这个错误。我尝试了
某些HTML\u字符串
的所有可能情况,但我无法再现错误。@user1516873我尝试将
节点
值传递给
,但即使这样也不会导致
空点异常
。这就是为什么我非常确定
节点
值不为空。非常感谢您的回答。还有一件事,我想问你,这是否是发生这种异常的唯一条件。我只是想确保在修复此错误后,在另一个场景中不会再次出现此异常。@DheerajKumarAggarwal请参阅编辑非常感谢您为我的错误提供了解决方案。如果不允许将文本值设置为
null
to,则应引发异常!