Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException

本文介绍了一个在使用Java操作XML时遇到的NullPointerException问题及其解决方案。问题出现在利用Transformer将内存中的XML树转换为文件的过程中,最终发现是由于XML树中存在内容为null的节点导致。文章详细分析了错误产生的原因,并提供了一种简单的解决方法:在设置节点内容前检查其是否为null。
摘要由CSDN通过智能技术生成

转自:https://www.jb51.net/article/98644.htm

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

    问题解决!

转载于:https://www.cnblogs.com/sharpest/p/11555773.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值