我已经使用JAXP构建了一个文档,如下所示:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
Element rootElement = document.createElement("Root");
for (MyObject o : myCollection) {
Element entry = document.createElement("Entry");
Element entryItem = document.createElement("EntryItem");
entryItem.appendChild(document.createTextNode(o.getProperty()));
entry.appendChild(entryItem);
rootElement.appendChild(entry);
}
document.appendChild(rootElement);
现在,当我尝试像这样输出文档的XML时:
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new StringWriter());
transformer.transform(source, result);
System.out.println(result.getWriter().toString());
它在
transformer.transform
行上崩溃,并出现以下错误:FATAL ERROR: 'java.lang.NullPointerException'
:null
我该如何调试呢?我确保
transformer
,source
和result
不为空。 最佳答案
我猜这:
entryItem.appendChild(document.createTextNode(o.getProperty()));
创建一个具有空值的文本节点。查看Xerces的代码(这是Oracle JDK 1.6附带的默认JAXP实现),在构造文本节点时,我没有看到任何空验证。我怀疑这会使
Transformer
死亡。要么是这样,要么是某些JAXp配置问题。
您可能希望设置
jaxp.debug
系统属性(可用的JDK 1.6+)来获取一些JAXP跟踪信息。