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

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

               

    问题解决!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值