Java xml出現錯誤 javax.xml.transform.TransformerException: java.lang.NullPointerException解決辦法:
利用Java操作XML,在操作XML過程中,執行到最后一步,在利用Transformer進行XML轉換時出現NullPointerException錯誤,出問題的部分代碼如下:
1
2
3
4
5
6
7
8
9
10
|
//轉換 TransformerFactory tFactory =TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer(); //需要轉換的內存中XML源文件 DOMSource source = new DOMSource(xmlDoc1); //生成的xml文件 File xmlDoc2 = new File(outPutPath+generateXmlFileName); StreamResult result = new StreamResult(xmlDoc2); //轉換 transformer.transform(source, result); |
運行到transform函數時出現以下錯誤(比較長,由于我是利用SWING設計圖形界面的,所以會有一些圖形界面事件調用的錯誤):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
javax.xml.transform.TransformerException: java.lang.NullPointerException at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor m(TransformerImpl.java: 717 ) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor m(TransformerImpl.java: 313 ) at operation.AddNeuronID.addNeuronId(AddNeuronID.java: 273 ) at operationUI.AddNeuronIDListener.constructor2Perform(AddNeuronIDListen er.java: 245 ) at operationUI.AddNeuronIDListener.actionPerformed(AddNeuronIDListener.j ava: 85 ) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java: 19 95 ) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.jav a: 2318 ) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel .java: 387 ) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java: 242 ) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonL istener.java: 236 ) at java.awt.Component.processMouseEvent(Component.java: 6041 ) at javax.swing.JComponent.processMouseEvent(JComponent.java: 3265 ) at java.awt.Component.processEvent(Component.java: 5806 ) at java.awt.Container.processEvent(Container.java: 2058 ) at java.awt.Component.dispatchEventImpl(Component.java: 4413 ) at java.awt.Container.dispatchEventImpl(Container.java: 2116 ) at java.awt.Component.dispatchEvent(Component.java: 4243 ) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java: 4322 ) at java.awt.LightweightDispatcher.processMouseEvent(Container.java: 3986 ) at java.awt.LightweightDispatcher.dispatchEvent(Container.java: 3916 ) at java.awt.Container.dispatchEventImpl(Container.java: 2102 ) at java.awt.Window.dispatchEventImpl(Window.java: 2440 ) at java.awt.Component.dispatchEvent(Component.java: 4243 ) at java.awt.EventQueue.dispatchEvent(EventQueue.java: 599 ) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre ad.java: 273 ) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread. java: 183 ) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre ad.java: 173 ) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java: 168 ) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java: 160 ) at java.awt.EventDispatchThread.run(EventDispatchThread.java: 121 ) Caused by: java.lang.NullPointerException at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.characters (ToUnknownStream.java: 317 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 240 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 226 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 226 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 226 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 226 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 226 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 226 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 226 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 226 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 132 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 94 ) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor mIdentity(TransformerImpl.java: 662 ) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor m(TransformerImpl.java: 708 ) ... 29 more --------- java.lang.NullPointerException at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.characters (ToUnknownStream.java: 317 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 240 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 226 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 226 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 226 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 226 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 226 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 226 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 226 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 226 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 132 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java : 94 ) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor mIdentity(TransformerImpl.java: 662 ) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor m(TransformerImpl.java: 708 ) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor m(TransformerImpl.java: 313 ) at operation.AddNeuronID.addNeuronId(AddNeuronID.java: 273 ) at operationUI.AddNeuronIDListener.constructor2Perform(AddNeuronIDListen er.java: 245 ) at operationUI.AddNeuronIDListener.actionPerformed(AddNeuronIDListener.j ava: 85 ) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java: 19 95 ) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.jav a: 2318 ) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel .java: 387 ) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java: 242 ) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonL istener.java: 236 ) at java.awt.Component.processMouseEvent(Component.java: 6041 ) at javax.swing.JComponent.processMouseEvent(JComponent.java: 3265 ) at java.awt.Component.processEvent(Component.java: 5806 ) at java.awt.Container.processEvent(Container.java: 2058 ) at java.awt.Component.dispatchEventImpl(Component.java: 4413 ) at java.awt.Container.dispatchEventImpl(Container.java: 2116 ) at java.awt.Component.dispatchEvent(Component.java: 4243 ) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java: 4322 ) at java.awt.LightweightDispatcher.processMouseEvent(Container.java: 3986 ) at java.awt.LightweightDispatcher.dispatchEvent(Container.java: 3916 ) at java.awt.Container.dispatchEventImpl(Container.java: 2102 ) at java.awt.Window.dispatchEventImpl(Window.java: 2440 ) at java.awt.Component.dispatchEvent(Component.java: 4243 ) at java.awt.EventQueue.dispatchEvent(EventQueue.java: 599 ) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre ad.java: 273 ) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread. java: 183 ) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre ad.java: 173 ) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java: 168 ) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java: 160 ) at java.awt.EventDispatchThread.run(EventDispatchThread.java: 121 ) |
一開始我也感到奇怪,transform函數只是把在內存中的XML樹轉換成文件,為何會出現nullPointer錯誤呢。上網查了一下,沒什么人找到答案,最后在(http://blog.awe.cz/post/english/beware-of-null-text-nodes/)這個blog中找到相當有用的答案.
其實認真看看出錯的信息,會發現有個信息比較重要:
1
2
3
|
java.lang.NullPointerException at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.characters(ToUnknownStream.java: 317 ) at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java: 240 ) |
從這里可以看出是由于com.sun.org.apache.xml.internal.serializer.ToUnknownStream.java文件中的characters函數出錯,所在行數是317,到jdk安裝目錄,找到src,到相應的文件夾serializer中找到ToUnknownStream.java,找到以下函數
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/** * Converts the String to a character array and calls the SAX method * characters(char[],int,int); * * @see ExtendedContentHandler#characters(String) */ public void characters(String chars) throws SAXException { final int length = chars.length(); if (length > m_charsBuff.length) { m_charsBuff = new char [length* 2 + 1 ]; } chars.getChars( 0 , length, m_charsBuff, 0 ); this .characters(m_charsBuff, 0 , length); } |
很明顯,注意int length = chars.length(); 如果參數chars是null的話,調用length函數就會出現nullpoiterException錯誤。再上一層,com.sun.org.apache.xalan.internal.xsltc.trax下的DOM2TO.java文件的parse函數(240行):
1
2
3
|
case Node.TEXT_NODE: _handler.characters(node.getNodeValue()); break ; |
在這里,就可以知道characters函數為什么出現null參數了。原因是此結點是文本結點TEXT_NODE,而調用本結點中沒有內容(null),當調用getNodeValue時,返回null.
上升到transform函數,出現結點內容為null,那在DOMSource類中,由于它是在內存中建立起來的XML樹,所以肯定是這個XML樹中的有一個或多個元素或結點的內容為null。
OK,問題原因找到。解決辦法很簡單,DOMSource中有元素或結點為null,那一定是在操作XML時,或者是修改內容,添加元素等等操作,使內容變為null。所以現在需要做的就是找到修改或添加元素內容的代碼,把有可能出現null的情況進行處理,如果檢測到為null,則不修改XML或不添加此元素。最簡單的方法就是用if語句。即setNodeValue(String str)或setTextContent(String str)之前,先查看參數str是否為空(if(str == null)),如果空則不調用此函數。
而在我的程序中,確實我是把空的內容加入到元素中。代碼如下:deviceAndIDMap是一個HashMap,當它調用get時,不存在此主鍵時,會返回null.
1
2
3
|
String neuronIdStr = deviceAndIDMap.get(nameContent); //更新 neuronIdElem.getFirstChild().setNodeValue(neuronIdStr); |
因此我加一下if語句,就可以解決問題了,代碼(此代碼是在for循環中的,因此用coninue來跳過本次的修改)如下:
1
2
3
4
5
6
7
8
|
String neuronIdStr = deviceAndIDMap.get(nameContent); if (neuronIdStr == null ) { continue ; } //更新 neuronIdElem.getFirstChild().setNodeValue(neuronIdStr); |
問題解決!
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/masson32/article/details/4517643