任何人都可以告诉我这段代码如何导致空文档,但不抛出异常吗?
document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader("<?xml version=\"1.0\"?><company>test</company>")));
最初:
private Document load(String message) throws MessagingException, IOException {
Document document = null;
try {
document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(message.substring(message.indexOf(XML_BEGIN),
message.indexOf(XML_END)))));
}
catch (Exception e) {
e.printStackTrace();
}
...
Element element = document.getElementById(TIME_STAMP);
结果:
java.lang.NullPointerException
at ...view.MailReceiver.parse(MailReceiver.java:156)
at ...view.MailReceiver.notify(MailReceiver.java:99)
at ...view.MailReceiver.main(MailReceiver.java:72)
答案 0 :(得分:1)
我认为该文档不是null
。
// Parse XML into Document.
String xml = "<?xml version=\"1.0\"?><company>test</company>";
Document document = DocumentBuilderFactory
.newInstance()
.newDocumentBuilder()
.parse(new InputSource(new StringReader(xml)));
// Format Document to XML again.
StringWriter writer = new StringWriter();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(document), new StreamResult(writer));
System.err.println(writer);
打印
<?xml version="1.0" encoding="UTF-8" standalone="no"?><company>test</company>
所以document
不是空的。
打印document
会向您[#document: null]
提供null
,因为它提到了document
,这可能有点令人困惑。但是,这并不会使null
本身{{1}}。
答案 1 :(得分:0)
在您的原始代码中,我怀疑由于子字符串稍微“关闭”而导致XML格式错误。
当你正在寻找你的“XML_END”字符串时,假设它实际上是你要解析的XML的一部分(例如“”作为一个随机的例子),你还必须添加这个字符串的长度,或者你会遗漏你的部分XML
此外,substring在endIndex上是独占的,所以你可能也需要+1。
要开始检查所有这些,我会将XML字符串(在子字符串之后)分配到变量中并使用log4j(或System.out.println)进行记录以查看。
在您的原始代码中,如果发生了解析异常,那么您正在使用空文档 - 不好!可能是您的NullPointerException的原因。通常你会在catch块中抛出一个异常。