Java xml error javax.xml.transform.TransformerException: java.lang.NullPointerException Solution:
Use Java to operate XML. During the XML operation, the last step is executed. When using Transformer to perform XML conversion, a NullPointerException error occurs. Some of the codes that have problems are as follows:
//Convert TransformerFactory tFactory =TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer(); //In-memory XML source file DOMSource source = new DOMSource(xmlDoc1); //The generated xml file File xmlDoc2 = new File(outPutPath+generateXmlFileName); StreamResult result = new StreamResult(xmlDoc2); //Convert transformer.transform(source, result);
When I run to the transform function, I get the following error (it's relatively long. Since I use SWING to design the graphical interface, there will be some errors in the graphical interface event call):
javax.xml.transform.TransformerException: java.lang.NullPointerException at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:717) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313) at operation.AddNeuronID.addNeuronId(AddNeuronID.java:273) at operationUI.AddNeuronIDListener.constructor2Perform(AddNeuronIDListener.java:245) at operationUI.AddNeuronIDListener.actionPerformed(AddNeuronIDListener.java:85) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.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(EventDispatchThread.java:273) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.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.transformIdentity(TransformerImpl.java:662) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(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.transformIdentity(TransformerImpl.java:662) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:708) at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313) at operation.AddNeuronID.addNeuronId(AddNeuronID.java:273) at operationUI.AddNeuronIDListener.constructor2Perform(AddNeuronIDListener.java:245) at operationUI.AddNeuronIDListener.actionPerformed(AddNeuronIDListener.java:85) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.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(EventDispatchThread.java:273) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.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)
At first I was also surprised that the transform function just converts the XML tree in memory into a file, so why does the nullPointer error occur? I checked the Internet and found no one to answer. Finally, I found a very useful answer in the blog (http://blog.awe.cz/post/english/beware-of-null-text-nodes/).
In fact, if you look carefully at the error information, you will find that there is something more important:
java.lang.NullPointerExceptionat 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)
From here, we can see that it is because the characters function in the com.sun.org.apache.xml.internal.serializer.ToUnknownStream.java file has an error. The number of lines is 317. Go to the jdk installation directory, find src, and find ToUnknownStream.java in the corresponding folder serializer. Find the following function.
/** * 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); } Obviously, note that int length = chars.length(); If the parameter chars is null, a nullpoiterException error will occur when calling the length function. Next layer, parse function (line 240) of the DOM2TO.java file under com.sun.org.apache.xalan.internal.xsltc.trax:
case Node.TEXT_NODE: _handler.characters(node.getNodeValue()); break;
Here, you can know why the characters function has null parameters. The reason is that this node is the text node TEXT_NODE, and there is no content in the call to this node (null). When getNodeValue is called, null is returned.
Ascend to the transform function, the node content is null. In the DOMSource class, since it is an XML tree established in memory, it is definitely that the content of one or more elements or nodes in this XML tree is null.
OK, the cause of the problem was found. The solution is very simple. If there are elements or nodes in DOMSource that are null, it must be when operating XML, or modifying content, adding elements, etc. to make the content null. So what you need to do now is to find the code to modify or add the element content, and process the possibility of null. If it is detected as null, do not modify the XML or add this element. The easiest way is to use if statement. That is, before setNodeValue(String str) or setTextContent(String str), first check whether the parameter str is empty (if(str == null)). If it is empty, this function will not be called.
And in my program, I do add empty content to the element. The code is as follows: deviceAndIDMap is a HashMap. When it calls get, when this primary key does not exist, it will return null.
String neuronIdStr = deviceAndIDMap.get(nameContent); //Update neuronIdElem.getFirstChild().setNodeValue(neuronIdStr);
Therefore, I can solve the problem by adding if statement. The code (this code is in the for loop, so use coninue to skip this modification) as follows:
String neuronIdStr = deviceAndIDMap.get(nameContent); if(neuronIdStr == null) { continue; } //Update neuronIdElem.getFirstChild().setNodeValue(neuronIdStr); Problem solved!
Thank you for reading, I hope it can help you. Thank you for your support for this site!