转自: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); |
问题解决!