Java xml 오류 javax.xml.transform.TransformerException: java.lang.NullPointerException

Java xml 오류 javax.xml.transform.TransformerException: java.lang. NullPointerException 솔루션:
Java를 이용하여 XML을 조작하고 XML을 조작하는 과정에서 마지막 단계까지 실행합니다. Transformer를 이용하여 XML 변환을 할 때 NullPointerException 오류가 발생했습니다. 문제의 일부 코드는 다음과 같습니다.

 //  
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를 이용하여 도형 인터페이스를 설계했기 때문에 도형 인터페이스 이벤트를 호출하는 오류가 있습니다.)

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/) 이 블로그에서 상당히 유용한 답안을 찾았다.
사실 잘못된 정보를 진지하게 보면 어떤 정보가 비교적 중요하다는 것을 발견할 수 있다.

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에서 ToUnknown Stream을 찾습니다.java, 다음 함수 찾기

/** 
  * 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);  
  }  
분명히 intlength=chars에 주의하세요.length(); 매개 변수chars가null이면length 함수를 호출하면nullpoiterException 오류가 발생합니다.한 층 더,com.sun.org.apache.xalan.internal.xsltc.trax의 DOM2TO.java 파일의 parse 함수(240줄):

case Node.TEXT_NODE: 
    _handler.characters(node.getNodeValue()); 
    break; 
여기서characters 함수에null 파라미터가 왜 생겼는지 알 수 있습니다.왜냐하면 이 결점은 텍스트 결점 TEXT_NODE, 이 결점에 내용이 없습니다. getNodeValue를 호출할 때null로 돌아갑니다.
transform 함수로 올라가면 결점 내용은null입니다. 그러면 DOMsource 클래스에서 메모리에 만들어진 XML 트리이기 때문에 이 XML 트리에 하나 이상의 요소나 결점이 있는 내용은null입니다.
OK, 문제의 원인을 찾았다.해결 방법은 매우 간단하다. DOMsource에 요소나 결점이null로 되어 있다. 그것은 반드시 XML을 조작할 때나 내용을 수정하고 요소를 추가하는 등 조작을 해서 내용을null로 바꾸는 것이다.그래서 지금 해야 할 일은 원소의 내용을 수정하거나 추가하는 코드를 찾아서 null이 나타날 수 있는 상황을 처리하고, null로 검출되면 XML을 수정하지 않거나 이 원소를 추가하지 않는 것입니다.가장 간단한 방법은 if문장을 사용하는 것이다.즉, setNodeValue(Stringstr)나 setTextContent(Stringstr) 전에 매개 변수str가 비어 있는지 확인하고, 비어 있으면 이 함수를 호출하지 않습니다.
내 프로그램에서, 확실히 나는 빈 내용을 원소에 넣었다.코드는 다음과 같습니다. device AndIDMap은 HashMap입니다. get을 호출할 때 이 키가 존재하지 않을 때null로 되돌아옵니다.

String neuronIdStr = deviceAndIDMap.get(nameContent); 
//  
neuronIdElem.getFirstChild().setNodeValue(neuronIdStr); 
따라서 if문장을 추가하면 문제를 해결할 수 있습니다. 코드 (이 코드는 for순환 중이므로 coninue로 이번 수정을 건너뛰십시오) 는 다음과 같습니다.

String neuronIdStr = deviceAndIDMap.get(nameContent); 
if(neuronIdStr == null) 
{ 
   continue; 
} 
//  
neuronIdElem.getFirstChild().setNodeValue(neuronIdStr); 
               
문제 해결!
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기