0

谁能告诉我这段代码如何生成一个空文档,但不抛出异常?

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)
4

2 回答 2

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生成。

于 2012-04-18T19:12:55.903 回答
0

在您的原始代码中,我怀疑由于子字符串略微“关闭”,XML 格式不正确。
当您正在寻找“XML_END”字符串时,假设它实际上是您希望解析的 XML 的一部分(例如“”作为随机示例),您还必须添加该字符串的长度,或者您'将丢失部分 XML。
子字符串在 endIndex 上也是独占的,所以你可能也需要一个 +1。

要开始检查所有这些,我会将 XML 字符串(在子字符串化之后)分配给一个变量并使用 log4j(或 System.out.println)记录它以查看。

在您的原始代码中,如果发生解析异常,那么您将直接使用空文档 - 不好!可能是您的 NullPointerException 的原因。通常你会在 catch 块中抛出一个异常。

于 2012-04-18T21:31:46.620 回答