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

转自: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

时间: 2024-10-12 18:51:50

Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException的相关文章

java Document生成和解析xml

转自:https://blog.csdn.net/p812438109/article/details/81807440 Document场景:需要知道文档所有结构 需要把文档一些元素排序 文档中的信息被多次使用的情况 优势:由于Document是java中自带的解析器,兼容性强 缺点:由于Document是一次性加载文档信息,如果文档太大,不太适用 Document操作步骤第一步:初始化xml解析工厂 DocumentBuilderFactory factory = DocumentBuild

JAVA基础学习之XMLCDATA区、XML处理指令、XML约束概述、JavaBean、XML解析(8)

1.CDATA区在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理.遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出.语法:<![CDATA[ 内容 ]]> <![CDATA[ <book> <br/> </book> ]]> 2.处理指令处理指令,简称PI (processing instruction).处理指令用来指挥解析引擎如何解析XML文

Jdk升级到11引起的问题:程序包javax.xml.bind.annotation不存在

Jdk12 都发布了, 我也下载一个玩一玩吧.刚准备要下载,发现之前已经下载了一个11, 那就11 吧,也不用太新了. 安装了jdk11,习惯性的设置了一下环境变量: JAVA_HOME=D:\tool\jdk-11.0.2. JAVA_HOME=D:\Program Files\Java\jdk1.8.0_201 设置完了,忘记改回去了. 项目中其实使用的是jdk8,结果运行 mvn 遇到了这么一个问题, 搞了好久才解决问题.仅此记录一下! 问题是,使用cmd 执行 mvn clean ins

原 Java学习之Xml系列二:xml按条件查询、xml递归遍历所有元素和属性

xml中加入了几条,为了方便查询时作为示例. 话不多说见代码注释: DTD文件:SwordTypeDefinition.dtd <?xml version="1.0" encoding="UTF-8"?> <!ELEMENT SwordLibrary (Sword*)> <!ELEMENT Sword (SwordName,Price,Attack)> <!ELEMENT SwordName (#PCDATA)> &l

JAVA中使用DOM解析XML文件

JAVA中使用DOM解析XML文件: 创建DocumentBuilderFactory的对象                                 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 创建DocumentBuilder对象 通过documentBuilder对象的parser方法加载xml文件到当前项目下 获取所有XML文件内节点的集合    getElementsByTagName()方

xml字符串和java实体类相互转换JaxbXmlUtil工具类 附java实体类生成soap接口报文案例

JaxbXmlUtil工具类 package com.aiait.ivs.util; import java.io.StringReader; import java.io.StringWriter; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; /** * Jaxb工具类 xml和java类相互转换 * * @author sunj

java中用SAX方式解析xml文件

SAX是Simple API for XML的缩写,它并不是由W3C官方所提出的标准.SAX是一种轻量型的方法,不像DOM解析时,把XML文档全部载入内存中,在PC上操作,Dom还有优势,但在手机中端上则无优势,因为手机内存和硬件都比不上PC强.使用 SAX 是比较安全的,并且 Android 提供了一种传统的 SAX 使用方法,以及一个便捷的 SAX 包装器.SAX采用基于事件驱动的处理方式,它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理. 在SAX接口中,事件源是org.

XML与HTML区别,XML解析

1.XML与HTML的区别 XML 不是对 HTML 的替代 ,XML 是对 HTML 的补充. XML 不会替代 HTML,理解这一点很重要.在大多数 web 应用程序中,XML 用于传输数据,而 HTML 用于格式化并显示数据. 对 XML 最好的描述是:XML 是独立于软件和硬件的信息传输工具. 比较内容 HTML XML   可扩展性 不具有扩展性 是元标记语言,可自定义新的标记 作用 焦点是数据的外观,旨在显示信息 被设计来传输和存储数据,焦点是数据的内容 语法要求 不要求标记的嵌套.

XML DTD约束 对xml文件的crud的查询Read Retrieve操作 xml递归遍历

本地的dtd文档 xml中引入dtd文档 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE 书架 SYSTEM "book.dtd"> <书架> <书> <书名>Java就业培训教程</书名> <作者>张孝祥</作者> <售价>39.00</售价> </书> <书