java xml 오류 javax.xml.transform.transformerexception : java.lang.nullpointerexception 솔루션 :
Java를 사용하여 XML을 작동하십시오. XML 작업 중에 마지막 단계가 실행됩니다. 변압기를 사용하여 XML 변환을 수행하면 NullPointerException 오류가 발생합니다. 문제가있는 코드 중 일부는 다음과 같습니다.
// 변환 변환 tfactory = transformerFactory.NewInstance (); 변압기 변압기 = tfactory.newtransformer (); // 인 메모리 XML 소스 파일 domsource source = new domsource (xmldoc1); // 생성 된 XML 파일 파일 XMLDOC2 = 새 파일 (outputPath+GenerateXmlFilename); StreamResult 결과 = New StreamResult (XMLDOC2); // 변환기 변환 (소스, 결과);
변환 함수로 실행되면 다음 오류가 발생합니다 (비교적 길다. 스윙을 사용하여 그래픽 인터페이스를 설계하기 때문에 그래픽 인터페이스 이벤트 호출에 몇 가지 오류가있을 것이다).
javax.xml.transform.transformerexception : java.lang.nullpointerexception at com.sun.org.apache.xalan.internal.xsltc.trax.transformerimpl.transform (transperimpl.java:717) at com.sun.org.apache.xalan.internal.xsltc.trax.transformerimpl.transform (transporimpl.java:313) at at atobly.addneuronid.addneuronid (addneuronid.java:273) at operatui.addneuronidlistener.constructor2perform (AddneuronIdlistener.java:245)에서 at operatui.addneuronidlistener.actionperformed (addneuronidlistener.java:85) at javax.swing.swing.spractbutton.fireeactperformed (AbstractButton) javax.swing.abstractbutton $ handler.actionperformed (javax.swing.defaultbuttonmodel.fireacctionperformed (defaultbuttonmodel.java:387)의 javax.swing.defaultbuttonmodel.ssetpressed (defaulttonmodba). at javax.swing.plaf.basic.basicbuttonlistener.mouserEled (java.awt.component.processeevent (component.java:6041) at javax.swing.jcomponent.processeevent (java:3265) at java.awt.component.processevent (component.java:5806) at java.awt.container.processevent (container.java:2058)의 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.container.container.container.conter.java.java:2102) at java.awt.window.dispatcheventimpl (winde java.eventdispatchthread.pumponeeventforfilters (eventDispatchThread.java:273) at java.awt.eventDispatchThread.pumpeventSforFilter (eventDispatchThread.java:183) at Java.awt.eventDispatchThread.pumpeventSforHierArchy (java.awt.eventDispatchThread.pumpevents.java:168)의 java.eventDispatchThread.pumpevents (evityDispatchevat.16). at Java.awt.eventDispatchThread.run (java.lang.nullpointerexception at com.sun.org.apache.xml.internal.serializer.tounnownstream.characters (tounlynigrstream.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 (transpormerimpl.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 (tounkendrestream.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 (com.sun.org.apache.xalan.internal.xsltc.trax.transformerimpl.transform (transformerimpl.java:708) at com.sun.org.apache.xalan.internal.xsltc.trax.transformerimpl.transform (transporimpl.java:313) at at atobly.addneuronid.addneuronid (addneuronid.java:273) at operatui.addneuronidlistener.constructor2perform (AddneuronIdlistener.java:245)에서 at operatui.addneuronidlistener.actionperformed (addneuronidlistener.java:85) at javax.swing.swing.spractbutton.fireeactperformed (AbstractButton) javax.swing.abstractbutton $ handler.actionperformed (javax.swing.defaultbuttonmodel.fireacctionperformed (defaultbuttonmodel.java:387)의 javax.swing.defaultbuttonmodel.ssetpressed (defaulttonmodba). at javax.swing.plaf.basic.basicbuttonlistener.mouserEled (java.awt.component.processeevent (component.java:6041) at javax.swing.jcomponent.processeevent (java:3265) at java.awt.component.processevent (component.java:5806) at java.awt.container.processevent (container.java:2058)의 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.container.container.container.conter.java.java:2102) at java.awt.window.dispatcheventimpl (winde java.eventdispatchthread.pumponeeventforfilters (eventDispatchThread.java:273) at java.awt.eventDispatchThread.pumpeventSforFilter (eventDispatchThread.java:183) at Java.awt.eventDispatchThread.pumpeventSforHierArchy (java.awt.eventDispatchThread.pumpevents.java:168)의 java.eventDispatchThread.pumpevents (evityDispatchevat.16). at Java.awt.eventDispatchThread.run (eventDispatchThread.java:121)
처음에는 변환 함수가 메모리의 XML 트리를 메모리의 파일로 변환한다는 사실에 놀랐습니다. 왜 NULLPOINTER 오류가 발생합니까? 나는 인터넷을 확인하고 대답 할 사람을 찾지 못했습니다. 마지막으로 블로그에서 매우 유용한 답변을 찾았습니다 (http://blog.awe.cz/post/english/beware-of-null-text-nodes/).
실제로 오류 정보를주의 깊게 살펴보면 더 중요한 것이 있습니다.
java.lang.nullpointerexceptionat com.sun.org.apache.xml.internal.serializer.tounknownstream.characters (com.sun.org.apache.apache.xalan.internal.xsltc.trax.dom2to.carse (dom2to.java:240).
여기에서 문자가 com.sun.org.apache.xml.internal.serializer.tounlygrestream.java 파일에서 작동하기 때문임을 알 수 있습니다. 라인 수는 317입니다. JDK 설치 디렉토리로 이동하여 SRC를 찾은 다음 해당 폴더 세리어 라이저에서 tounknownstream.java를 찾으십시오. 다음 기능을 찾으십시오.
/** * 문자열을 문자 배열로 변환하고 색소폰 메소드 * 문자 (char [], int, int)를 호출합니다. * * @see ExtendedContenthandler#문자 (String) */ public void char if (길이> m_charsbuff.length) {m_charsbuff = new char [길이*2 + 1]; } chars.getchars (0, 길이, m_charsbuff, 0); this.characters (m_charsbuff, 0, 길이); } 분명히, int length = chars.length (); 매개 변수 Chars가 NULL 인 경우 길이 함수를 호출 할 때 NULLPOITEREXCeption 오류가 발생합니다. 다음 레이어, com.sun.org.apache.xalan.internal.xsltc.trax에서 dom2to.java 파일의 구문 분석 기능 (240 행).
case node.text_node : _handler.characters (node.getnodevalue ()); 부서지다;
여기서 문자 함수에 널 매개 변수가있는 이유를 알 수 있습니다. 그 이유는이 노드가 텍스트 노드 Text_node 이고이 노드 (null) 호출에 내용이 없기 때문입니다. getNodevalue가 호출되면 NULL이 반환됩니다.
변환 함수로 올라가면 노드 컨텐츠는 무일하게입니다. Domsource 클래스에서는 메모리에서 설정된 XML 트리 이므로이 XML 트리의 하나 이상의 요소 또는 노드의 내용이 NULL이라는 것은 분명히 있습니다.
좋아, 문제의 원인이 발견되었습니다. 솔루션은 매우 간단합니다. Domsource에 NULL 인 요소 또는 노드가있는 경우 XML을 작동하거나 컨텐츠를 수정하거나 요소 추가 등을 사용하여 컨텐츠를 null로 만들어야합니다. 따라서 지금해야 할 일은 요소 컨텐츠를 수정하거나 추가하는 코드를 찾고 NULL의 가능성을 처리하는 것입니다. NULL로 감지되면 XML을 수정 하거나이 요소를 추가하지 마십시오. 가장 쉬운 방법은 if 문을 사용하는 것입니다. 즉, setnodevalue (String Str) 또는 setTextContent (String Str) 이전에 먼저 매개 변수 str이 비어 있는지 확인하십시오 (if (str == null)). 비어 있으면이 기능은 호출되지 않습니다.
그리고 내 프로그램에서는 요소에 빈 콘텐츠를 추가합니다. 코드는 다음과 같습니다. DeviceAndIdMap은 해시 맵입니다. 호출되면이 기본 키가 존재하지 않으면 NULL을 반환합니다.
문자열 neuronidstr = deviceandidmap.get (namecontent); // neuronidelem.getFirstChild (). setNodevalue (neuronidstr);
따라서 IF 문을 추가하여 문제를 해결할 수 있습니다. 코드 (이 코드는 For Loop에 있으므로 Coninue를 사용 하여이 수정을 건너 뜁니다) : 다음과 같이.
문자열 neuronidstr = deviceandidmap.get (namecontent); if (neuronidstr == null) {계속; } // 업데이트 neuronidelem.getFirstChild (). setNodevalue (neuronidstr); 문제가 해결되었습니다!
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!