Java XML خطأ javax.xml.transform.transformerexception: java.lang.nullpointerxception الحل:
استخدم Java لتشغيل XML. أثناء عملية XML ، يتم تنفيذ الخطوة الأخيرة. عند استخدام Transformer لإجراء تحويل XML ، يحدث خطأ NullPointerException. بعض الرموز التي لديها مشاكل هي كما يلي:
// تحويل transformerfactory tfactory = transformerfactory.newinstance () ؛ Transformer Transformer = tfactory.newransformer () ؛ // In-Memory XML Source File Source Source = New DomSource (XMLDOC1) ؛ // ملف ملف XML الذي تم إنشاؤه XMLDOC2 = ملف جديد (OutputPath+cenderatexmlfilename) ؛ StreamResult Result = New StreamResult (XMLDOC2) ؛ // تحويل transformer.transform (المصدر ، النتيجة) ؛
عندما أقوم بالركض إلى وظيفة التحويل ، أحصل على الخطأ التالي (إنه طويل نسبيًا. بما أنني أستخدم Swing لتصميم الواجهة الرسومية ، فستكون هناك بعض الأخطاء في مكالمة حدث الواجهة الرسومية):
javax.xml.transform.transformerexception: java.lang.nullpointerxception في com.sun.org.apache.xalan.internal.xsltc.trax.transformpl.transform (transformpl.java:717) على com.sun.org.apache.xalan.internal.xsltc.trax.transformpl.transform (TransformerImpl.Java:313) at Operation.Addneuronid.Addneuronid (addneuronid.java:273) at Operationui.AddneuronIdListener.Constructor2perform (AddNeUronIdListener.java:245) في Operationui.AddneuronIdListener.ActionPerformed (addneuronidlistener.java:85) في javax.swing.abstractbutton.fireactyperformed javax.swing.abstractbutton $ Handler.ActionPerformed (AbstractButton.Java:2318) في javax.swing.defaultbuttonmodel.fireaationperforfforfforforded في javax.swing.plaf.basic.basicbuttonlistener.mousereleSeped (basicbuttonlistener.java:236) في java.awt.component.processmouseevent (component.java:6041) في javax.swing.jcomponent.processevent java.awt.component.processevent (component.java:5806) في java.awt.container.processevent (container.java:2058) على java.awt.component.dispatcheventimpl (component.java:4413) at java.awt.container.dispatcatcheventimpl (حاوية. java.awt.lightweightDispatcher.ProcessMouseEvent (حاوية. java.awt.window.dispatcheventimpl (window.java:2440) في java.awt.component.dispatchevent (component.java:4243) في java.awt.eventqueue.dispatchevent (eventqueue.java:599) على java.awt.eventDispatchThread.pumponeEventForFilters (eventDispatchThread.java:273) في java.awt.eventDispatchThread.pumpeventsforfilter (EventDispatchthread.java:183) في java.awt.eventdispatchthread.pumpeventsforhierarchy (eventDispatchThread.java:173) في java.awt.eventdispatchthrothread.pumpevents (eventDispatchThread.java:168) في java.awt.eventdiStthRead.pumpevents ( java.awt.eventDispatchThread.Run (eventDispatchThread.java:121) سبب: java.lang.nullpointerexception في com.sun.org.apache.xml.internal.serializer.tounknownstream.shoters (tounmarnstream.java:317) at 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) في com.sun.org.apache.xalan.internal.xsltc.trax.transformpl.transformidentity (transformpl.java:662) at com.sun.org.apache.xalan.internal.xsltc.trax.transformpl.transform (transformerimpl.java:708) ... 29 more --------- java.lang.nullpointerxception at com.sun.org.apache.xml.internal.serializer.tounknownstream.characters (tounynowstream.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) 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) com.sun.org.apache.xalan.internal.xsltc.trax.transformpl.transformidentity (transformerimpl.java:662) في com.sun.org.apache.xalan.internal.xsltc.trax.transformpl. com.sun.org.apache.xalan.internal.xsltc.trax.transformpl.transform (TransformerImpl.Java:313) at Operation.Addneuronid.Addneuronid (addneuronid.java:273) at Operationui.AddneuronIdListener.Constructor2perform (AddNeUronIdListener.java:245) في Operationui.AddneuronIdListener.ActionPerformed (addneuronidlistener.java:85) في javax.swing.abstractbutton.fireactyperformed javax.swing.abstractbutton $ Handler.ActionPerformed (AbstractButton.Java:2318) في javax.swing.defaultbuttonmodel.fireaationperforfforfforforded في javax.swing.plaf.basic.basicbuttonlistener.mousereleSeped (basicbuttonlistener.java:236) في java.awt.component.processmouseevent (component.java:6041) في javax.swing.jcomponent.processevent java.awt.component.processevent (component.java:5806) في java.awt.container.processevent (container.java:2058) على java.awt.component.dispatcheventimpl (component.java:4413) at java.awt.container.dispatcatcheventimpl (حاوية. java.awt.lightweightDispatcher.ProcessMouseEvent (حاوية. java.awt.window.dispatcheventimpl (window.java:2440) في java.awt.component.dispatchevent (component.java:4243) في java.awt.eventqueue.dispatchevent (eventqueue.java:599) على java.awt.eventDispatchThread.pumponeEventForFilters (eventDispatchThread.java:273) في java.awt.eventDispatchThread.pumpeventsforfilter (EventDispatchthread.java:183) في java.awt.eventdispatchthread.pumpeventsforhierarchy (eventDispatchThread.java:173) في java.awt.eventdispatchthrothread.pumpevents (eventDispatchThread.java:168) في java.awt.eventdiStthRead.pumpevents ( 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.tounminkstream.characters (TounikenStream.java:317) في com.sun.org.apache.xalan.internal.xsltc.trax.dorse.
من هنا ، يمكننا أن نرى ذلك لأن الشخصيات تعمل في com.sun.org.apache.xml.internal.serializer.tounminkstream.java لها خطأ. عدد الخطوط هو 317. انتقل إلى دليل تثبيت JDK ، والعثور على SRC ، والعثور على tounknownstream.java في المجلد المتسلسل المقابل. ابحث عن الوظيفة التالية.
/** * يحول السلسلة إلى صفيف أحرف ويطلق على أحرف SAX * (char [] ، int ، int) ؛ * * seee ExtendedContentHandler#أحرف (سلسلة) */ أحرف void العامة (chars سلسلة) يلقي saxexception {final int length = chars.length () ؛ if (length> m_charsbuff.length) {m_charsbuff = new char [length*2 + 1] ؛ } chars.getChars (0 ، طول ، m_charsbuff ، 0) ؛ this.characters (m_charsbuff ، 0 ، طول) ؛ } من الواضح ، لاحظ أن طول int = chars.length () ؛ إذا كان chars المعلمة فارغًا ، فسيحدث خطأ nullpoiterexception عند استدعاء وظيفة الطول. الطبقة التالية ، وظيفة PARSE (السطر 240) من ملف dom2to.java ضمن com.sun.org.apache.xalan.internal.xsltc.trax:
case node.text_node: _handler.characters (node.getNodeValue ()) ؛ استراحة؛
هنا ، يمكنك معرفة لماذا تحتوي وظيفة الأحرف على معلمات فارغة. والسبب هو أن هذه العقدة هي NODE NODE TEXT_NODE ، ولا يوجد محتوى في المكالمة إلى هذه العقدة (NULL). عندما يتم استدعاء GetNodevalue ، يتم إرجاع NULL.
الصعود إلى وظيفة التحويل ، محتوى العقدة فارغ. في فئة DomSource ، نظرًا لأن شجرة XML التي تم إنشاؤها في الذاكرة ، فمن المؤكد أن محتوى عنصر أو أكثر من العناصر أو العقد في شجرة XML هذه خالية.
حسنًا ، تم العثور على سبب المشكلة. الحل بسيط للغاية. إذا كانت هناك عناصر أو العقد في DomSource خالية ، فيجب أن تكون عند تشغيل XML ، أو تعديل المحتوى ، وإضافة عناصر ، وما إلى ذلك لجعل المحتوى فارغًا. إذن ما عليك القيام به الآن هو العثور على الكود لتعديل أو إضافة محتوى العنصر ، ومعالجة إمكانية وجود NULL. إذا تم اكتشافه على أنه فارغ ، فلا تعدل XML أو أضف هذا العنصر. أسهل طريقة هي الاستخدام إذا بيان. وهذا هو ، قبل setNodeValue (String str) أو setTextContent (String Str) ، تحقق أولاً مما إذا كانت المعلمة STR فارغة (إذا (str == null)). إذا كانت فارغة ، فلن يتم استدعاء هذه الوظيفة.
وفي برنامجي ، أضيف محتوى فارغًا إلى العنصر. الرمز كما يلي: DeviceAndIdMap هو hashmap. عندما تستدعي المكالمات ، عندما لا يكون هذا المفتاح الأساسي غير موجود ، فسوف يعود فارغًا.
سلسلة neuronidstr = deviceandidmap.get (namecontent) ؛ // تحديث neuronidelem.getfirstchild (). setNodeValue (neuronidstr) ؛
لذلك ، يمكنني حل المشكلة عن طريق إضافة بيان. الرمز (هذا الرمز موجود في الحلقة ، لذا استخدم Coninue لتخطي هذا التعديل) على النحو التالي:
سلسلة neuronidstr = deviceandidmap.get (namecontent) ؛ if (neuronidStr == NULL) {متابعة ؛ } // تحديث neuronidelem.getfirstchild (). setNodeValue (neuronidStr) ؛ تم حل المشكلة!
شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!