2012-04-18 17 views
0

このコードがどのようにnull文書になるか教えてもらえますが、例外は発生しませんか?もともと文字列を文書に解析できません

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

私は、 'message'の値(または' substring() 'が返すもの)と' TIME_STAMP'の値がなければ、かなり役に立たないのではないかと恐れています。 –

答えて

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 nullではなかったです。

プリントアウトdocument[#document: null]です。これは、nullと記載されているため、少し混乱するかもしれません。しかし、document自体はnullになりません。

+0

しかし、ドキュメントのいずれかのメソッドを参照しようとするとNullPointerExceptionが発生します。したがって、まずそれを変換する必要がありますか? – Joe

+0

質問にすべてのコードを追加し、完全な例外スタックトレースを追加できますか?それは問題を見つけるのを助けるかもしれません:) –

+0

いくつかの行は省略されましたが、本質的な振る舞いは元の投稿に追加されています。 – Joe

0

元のコードでは、部分文字列がやや「オフ」になっているため、XMLがひどく形成されている可能性があります。
あなたの "XML_END"文字列を探しているとき、それを実際に解析したいXMLの一部(例えば "ランダムな例")として仮定すると、この文字列の長さにも追加する必要があります。 XMLの一部が失われてしまいます。
また、部分文字列はendIndexでは排他的ですので、そこに+1が必要な場合もあります。

これをすべてチェックするには、XML文字列を(部分文字列の後に)変数に代入し、log4j(またはSystem.out.println)を使用して変数に記録します。

元のコードでは、解析例外が発生した場合は、nullドキュメントを使用しています。おそらくあなたのNullPointerExceptionの原因です。通常、catchブロックに例外をスローします。

関連する問題