java xml ข้อผิดพลาด javax.xml.transform.transformerexception: java.lang.nullpointerexception โซลูชัน:
ใช้ Java เพื่อใช้งาน XML ในระหว่างการดำเนินการ XML ขั้นตอนสุดท้ายจะถูกดำเนินการ เมื่อใช้หม้อแปลงเพื่อดำเนินการแปลง XML จะเกิดข้อผิดพลาด nullpointerexception รหัสบางส่วนที่มีปัญหามีดังนี้:
// แปลง transformerFactory tfactory = transformerFactory.newInstance (); Transformer Transformer = tfactory.newTransformer (); // ในหน่วยความจำ XML แหล่งที่มา Domsource Source = new DomSource (XMLDOC1); // ไฟล์ XML ที่สร้างขึ้น XMLDOC2 = ไฟล์ใหม่ (OutputPath+GeneratexmlFileName); streamresult result = remriesult ใหม่ (xmldoc2); // แปลง transformer.transform (แหล่งที่มา, ผลลัพธ์);
เมื่อฉันวิ่งไปที่ฟังก์ชั่นการแปลงฉันได้รับข้อผิดพลาดต่อไปนี้ (มันค่อนข้างยาวเนื่องจากฉันใช้สวิงเพื่อออกแบบอินเทอร์เฟซกราฟิกจะมีข้อผิดพลาดบางอย่างในการเรียกเหตุการณ์อินเตอร์เฟสกราฟิก):
javax.xml.transform.transformerexception: java.lang.nullpointerexception ที่ com.sun.org.apache.xalan.internal.xsltc.trax.transformerimpl.transform (transformerimpl.java:717) ที่ com.sun.org.apache.xalan.internal.xsltc.trax.transformerimpl.transform (transformerimpl.java:313) ที่ Operation.addneuronid.addneuronid (addneuronid.java:273) ที่ OperationUi.addneuronidListener.Constructor2Perform (AddneuronidListener.java:245) ที่ OperationUi.addneuronidListener.actionperformed (addneuronidlistener.java:85) javax.swing.abstractbutton $ handler.actionperformed (AbstractButton.java:2318) ที่ Javax.swing.defaultButtonModel.FireActionPerformed javax.swing.plaf.basic.basicbuttonlistener.mouserleased (BasicButtonListener.java:236) ที่ java.awt.Component.processmousevent (Component.java:6041) java.awt.Component.processevent (Component.java:5806) ที่ java.awt.container.processevent (container.java:2058) ที่ java.awt.component.dispatcheventimpl (component.java:4413) java.awt.container.dispatcheventimpl (container.java:2116) ที่ java.awt.component.dispatchevent (component.java:4243) ที่ java.awt.lightweightdispatcher.retargetMousevent java.awt.lightweightdispatcher.processmousevent (container.java:3986) ที่ java.awt.lightweightdispatcher.dispatchevent (container.java:3916) ที่ java.awt.container.dispatcheventimpl java.awt.window.dispatcheventimpl (window.java:2440) ที่ java.awt.component.dispatchevent (component.java:4243) ที่ java.awt.eventqueue.dispatchevent java.awt.eventDispatchThread.pumponeVentForFilters (EventDispatchThread.java:273) ที่ java.awt.eventDispatchThread.pumpeventsforfilter (EventDispatchThread.java:183) ที่ java.awt.eventdispatchthread.pumpeventsforhierarchy (EventDispatchThread.java:173) ที่ java.awt.eventDispatchThread.pumpevents (EventDispatchThread.java:168) java.awt.eventDispatchThread.run (EventDispatchThread.java:121) เกิดจาก: java.lang.nullpointerexception ที่ com.sun.org.apache.xml.internal.serializer com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:240) ที่ com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:226) com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:226) ที่ com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:226 com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:226) ที่ com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:226 com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:226) ที่ com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:226 com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:226) ที่ com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:132 com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:94) ที่ com.sun.org.apache.xalan.internal.xsltc.trax.transformerimpl.Transformentity com.sun.org.apache.xalan.internal.xsltc.trax.transformerimpl.transform (transformerimpl.java:708) ... 29 เพิ่มเติม --------- java.lang.nullpointerexception ที่ com.sun.org.apache.xml.internal.serializer.tounnownstream.characters (tounknownstream.java:317) ที่ com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:240) com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:226) ที่ com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:226 com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:226) ที่ com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:226 com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:226) ที่ com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:226 com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:226) ที่ com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:226 com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:132) ที่ com.sun.org.apache.xalan.internal.xsltc.trax.dom2to.parse (dom2to.java:94 com.sun.org.apache.xalan.internal.xsltc.trax.transformerimpl.transformidentity (transformerimpl.java:662) ที่ com.sun.org.apache.xalan.internal.xsltc.trax.transforimpl.transform com.sun.org.apache.xalan.internal.xsltc.trax.transformerimpl.transform (transformerimpl.java:313) ที่ Operation.addneuronid.addneuronid (addneuronid.java:273) ที่ OperationUi.addneuronidListener.Constructor2Perform (AddneuronidListener.java:245) ที่ OperationUi.addneuronidListener.actionperformed (addneuronidlistener.java:85) javax.swing.abstractbutton $ handler.actionperformed (AbstractButton.java:2318) ที่ Javax.swing.defaultButtonModel.FireActionPerformed javax.swing.plaf.basic.basicbuttonlistener.mouserleased (BasicButtonListener.java:236) ที่ java.awt.Component.processmousevent (Component.java:6041) java.awt.Component.processevent (Component.java:5806) ที่ java.awt.container.processevent (container.java:2058) ที่ java.awt.component.dispatcheventimpl (component.java:4413) java.awt.container.dispatcheventimpl (container.java:2116) ที่ java.awt.component.dispatchevent (component.java:4243) ที่ java.awt.lightweightdispatcher.retargetMousevent java.awt.lightweightdispatcher.processmousevent (container.java:3986) ที่ java.awt.lightweightdispatcher.dispatchevent (container.java:3916) ที่ java.awt.container.dispatcheventimpl java.awt.window.dispatcheventimpl (window.java:2440) ที่ java.awt.component.dispatchevent (component.java:4243) ที่ java.awt.eventqueue.dispatchevent java.awt.eventDispatchThread.pumponeVentForFilters (EventDispatchThread.java:273) ที่ java.awt.eventDispatchThread.pumpeventsforfilter (EventDispatchThread.java:183) ที่ java.awt.eventdispatchthread.pumpeventsforhierarchy (EventDispatchThread.java:173) ที่ java.awt.eventDispatchThread.pumpevents (EventDispatchThread.java:168) 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.tounnowndentstream.Characters (tounknownstream.java:317) ที่ com.sun.org.apache.xalan.internal.xsltc.trax.trea
จากที่นี่เราจะเห็นว่าเป็นเพราะตัวละครฟังก์ชั่นใน com.sun.org.apache.xml.internal.serializer.tounnownknownstream.java มีข้อผิดพลาด จำนวนบรรทัดคือ 317 ไปที่ไดเรกทอรีการติดตั้ง JDK ค้นหา SRC และค้นหา tounknownstream.java ใน serializer โฟลเดอร์ที่สอดคล้องกัน ค้นหาฟังก์ชั่นต่อไปนี้
/** * แปลงสตริงเป็นอาร์เรย์อักขระและเรียกใช้วิธี SAX * อักขระ (char [], int, int); * * @See ExtendedContentHandler#อักขระ (สตริง) */ ตัวละครโมฆะสาธารณะ (สตริงตัวอักษร) พ่น SaxException {ความยาว int สุดท้าย = chars.length (); if (ความยาว> m_charsbuff.length) {m_charsbuff = ถ่านใหม่ [ความยาว*2 + 1]; } chars.getChars (0, ความยาว, m_charsbuff, 0); this.CHARACTERS (M_CHARSBUFF, 0, ความยาว); - เห็นได้ชัดว่าโปรดทราบว่าความยาว int = chars.length (); หากตัวถ่านพารามิเตอร์เป็นโมฆะข้อผิดพลาด nullpoiteRexception จะเกิดขึ้นเมื่อเรียกใช้ฟังก์ชันความยาว เลเยอร์ถัดไปฟังก์ชั่นการแยกวิเคราะห์ (บรรทัด 240) ของไฟล์ dom2to.java ภายใต้ com.sun.org.apache.xalan.internal.xsltc.trax:
case node.text_node: _handler.characters (node.getNodeValue ()); หยุดพัก;
ที่นี่คุณสามารถรู้ได้ว่าทำไมฟังก์ชั่นอักขระจึงมีพารามิเตอร์ว่าง เหตุผลก็คือโหนดนี้เป็นโหนดข้อความ text_node และไม่มีเนื้อหาในการโทรไปยังโหนดนี้ (null) เมื่อเรียกว่า getNodevalue จะส่งคืนค่า NULL
ขึ้นสู่ฟังก์ชั่นการแปลงเนื้อหาโหนดเป็นโมฆะ ในคลาส Domsource เนื่องจากเป็นต้นไม้ XML ที่จัดตั้งขึ้นในหน่วยความจำจึงแน่นอนว่าเนื้อหาขององค์ประกอบหรือโหนดหนึ่งหรือมากกว่าในต้นไม้ XML นี้เป็นโมฆะ
ตกลงสาเหตุของปัญหาพบ การแก้ปัญหานั้นง่ายมาก หากมีองค์ประกอบหรือโหนดใน Domsource ที่เป็นโมฆะจะต้องเป็นเมื่อใช้งาน XML หรือแก้ไขเนื้อหาการเพิ่มองค์ประกอบ ฯลฯ เพื่อให้เนื้อหาเป็นโมฆะ ดังนั้นสิ่งที่คุณต้องทำตอนนี้คือการค้นหารหัสเพื่อแก้ไขหรือเพิ่มเนื้อหาองค์ประกอบและประมวลผลความเป็นไปได้ของ NULL หากตรวจพบว่าเป็นโมฆะอย่าแก้ไข XML หรือเพิ่มองค์ประกอบนี้ วิธีที่ง่ายที่สุดคือใช้ถ้าคำสั่ง นั่นคือก่อนที่ setNodeValue (string str) หรือ setTextContent (string str) ก่อนตรวจสอบว่าพารามิเตอร์ str ว่างเปล่า (ถ้า (str == null)) หากว่างเปล่าฟังก์ชั่นนี้จะไม่ถูกเรียก
และในโปรแกรมของฉันฉันจะเพิ่มเนื้อหาที่ว่างเปล่าให้กับองค์ประกอบ รหัสมีดังนี้: DeviceAndIdMap เป็น hashmap เมื่อเรียกได้ว่าได้รับเมื่อคีย์หลักนี้ไม่มีอยู่มันจะส่งคืนค่า NULL
String neuronidstr = deviceAndidMap.get (namecontent); // อัปเดต Neuronidelem.getFirstChild (). SetNodeValue (NeuronIdStr);
ดังนั้นฉันสามารถแก้ปัญหาได้โดยการเพิ่มคำสั่ง รหัส (รหัสนี้อยู่ในลูปดังนั้นให้ใช้ coninue เพื่อข้ามการดัดแปลงนี้) ดังนี้:
String neuronidstr = deviceAndidMap.get (namecontent); if (neuronidstr == null) {ดำเนินการต่อ; } // อัปเดต Neuronidelem.getFirstChild (). SetNodeValue (NeuronIdStr); แก้ไขปัญหา!
ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!