Java xml出現(xiàn)錯誤 javax.xml.transform.TransformerException: java.lang.NullPointerException解決辦法:
利用Java操作XML,在操作XML過程中,執(zhí)行到最后一步,在利用Transformer進行XML轉(zhuǎn)換時出現(xiàn)NullPointerException錯誤,出問題的部分代碼如下:
1
2
3
4
5
6
7
8
9
10
|
//轉(zhuǎn)換 TransformerFactory tFactory =TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer(); //需要轉(zhuǎn)換的內(nèi)存中XML源文件 DOMSource source = new DOMSource(xmlDoc1); //生成的xml文件 File xmlDoc2 = new File(outPutPath+generateXmlFileName); StreamResult result = new StreamResult(xmlDoc2); //轉(zhuǎn)換 transformer.transform(source, result); |
運行到transform函數(shù)時出現(xiàn)以下錯誤(比較長,由于我是利用SWING設(shè)計圖形界面的,所以會有一些圖形界面事件調(diào)用的錯誤):
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函數(shù)只是把在內(nèi)存中的XML樹轉(zhuǎn)換成文件,為何會出現(xiàn)nullPointer錯誤呢。上網(wǎng)查了一下,沒什么人找到答案,最后在(http://blog.awe.cz/post/english/beware-of-null-text-nodes/)這個blog中找到相當(dāng)有用的答案.
其實認(rèn)真看看出錯的信息,會發(fā)現(xiàn)有個信息比較重要:
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函數(shù)出錯,所在行數(shù)是317,到j(luò)dk安裝目錄,找到src,到相應(yīng)的文件夾serializer中找到ToUnknownStream.java,找到以下函數(shù)
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(); 如果參數(shù)chars是null的話,調(diào)用length函數(shù)就會出現(xiàn)nullpoiterException錯誤。再上一層,com.sun.org.apache.xalan.internal.xsltc.trax下的DOM2TO.java文件的parse函數(shù)(240行):
1
2
3
|
case Node.TEXT_NODE: _handler.characters(node.getNodeValue()); break ; |
在這里,就可以知道characters函數(shù)為什么出現(xiàn)null參數(shù)了。原因是此結(jié)點是文本結(jié)點TEXT_NODE,而調(diào)用本結(jié)點中沒有內(nèi)容(null),當(dāng)調(diào)用getNodeValue時,返回null.
上升到transform函數(shù),出現(xiàn)結(jié)點內(nèi)容為null,那在DOMSource類中,由于它是在內(nèi)存中建立起來的XML樹,所以肯定是這個XML樹中的有一個或多個元素或結(jié)點的內(nèi)容為null。
OK,問題原因找到。解決辦法很簡單,DOMSource中有元素或結(jié)點為null,那一定是在操作XML時,或者是修改內(nèi)容,添加元素等等操作,使內(nèi)容變?yōu)閚ull。所以現(xiàn)在需要做的就是找到修改或添加元素內(nèi)容的代碼,把有可能出現(xiàn)null的情況進行處理,如果檢測到為null,則不修改XML或不添加此元素。最簡單的方法就是用if語句。即setNodeValue(String str)或setTextContent(String str)之前,先查看參數(shù)str是否為空(if(str == null)),如果空則不調(diào)用此函數(shù)。
而在我的程序中,確實我是把空的內(nèi)容加入到元素中。代碼如下:deviceAndIDMap是一個HashMap,當(dāng)它調(diào)用get時,不存在此主鍵時,會返回null.
1
2
3
|
String neuronIdStr = deviceAndIDMap.get(nameContent); //更新 neuronIdElem.getFirstChild().setNodeValue(neuronIdStr); |
因此我加一下if語句,就可以解決問題了,代碼(此代碼是在for循環(huán)中的,因此用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