अंधेरे में मूल कारण का शिकार करने के बजाय, मुझे लगता है कि यह समझाना बेहतर है कि एनपीई कैसे और क्यों होता है और उनसे कैसे बचा जा सकता है, ताकि ओपी अपनी छोटी सी समस्या का शिकार करने के लिए नए प्राप्त ज्ञान को लागू कर सके।पी>
देखिए, वस्तु संदर्भ (चर) में या तो एक पूर्ण योग्य Object
हो सकता है या बस कुछ नहीं , जो null
. है ।
SomeObject someObject1 = new SomeObject(); // References something.
SomeObject someObject2 = null; // References nothing.
अब, यदि आप कुछ नहीं तक पहुँचने का प्रयास कर रहे हैं (null
), तो आपको निस्संदेह एक NullPointerException
. मिलेगा , केवल इसलिए कि null
कोई चर या तरीके नहीं हैं।
someObject1.doSomething(); // Works fine.
someObject2.doSomething(); // Throws NullPointerException.
इसका समाधान काफी सरल है। इसे मूल रूप से दो तरीकों से किया जा सकता है:या तो इसे तत्काल करके या केवल इसे अनदेखा करके।
if (someObject2 == null) {
someObject2 = new SomeObject();
}
someObject2.doSomething(); // No NPE anymore!
या
if (someObject2 != null) {
someObject2.doSomething(); // No NPE anymore!
}
एनपीई के मामले में, स्टैकट्रेस की पहली पंक्ति संख्या सटीक रेखा को इंगित करती है जहां यह हुआ है। आपने सचमुच कहा "लाइन 272 है admin.birthList.add(list1);
". इस पंक्ति में दो . शामिल हैं वे स्थान जहां ऑब्जेक्ट संदर्भों को एक्सेस/इनवोक किया जाता है (डॉट .
ऑपरेटर)। पहला है admin.birthList
और दूसरा है birthList.add(list1)
. यह पता लगाने के लिए आप पर निर्भर है कि क्या एक या दोनों एनपीई का कारण बनते हैं। यदि यह पहला आह्वान है, तो admin
बस null
है . यदि यह दूसरा आह्वान है, तो birthList
बस null
है . आप इसे एक पूर्ण योग्य वस्तु के साथ त्वरित करके इसे ठीक कर सकते हैं।
संपादित करें: यदि आपके पास मूल कारण निर्धारित करने में कठिन समय है (जैसा कि टिप्पणियों से पता चलता है), तो आपको डिबगिंग सीखने की आवश्यकता है। एक डीबगर चलाएं या System.out.println()
की सहायता से "गरीब आदमी की डिबगिंग" करें उन्हें एक्सेस/आह्वान करने से पहले प्रत्येक चर का। पहले उस लाइन को देखें जहां एनपीई होता है। अगर यह उदाहरण के लिए है
admin.birthList.add(list1);
तो आपको मूल कारण को कम करने के लिए इसे निम्नानुसार बदलने की आवश्यकता है:
System.out.println("admin: " + admin);
List<Birth> birthList = admin.birthList;
System.out.println("birthList: " + birthList);
birthList.add(list1);
जांचें कि उनमें से कोई null
प्रिंट करता है या नहीं . वैकल्पिक रूप से आप यह भी कर सकते हैं:
if (admin == null) throw new NullPointerException("admin is null!");
List<Birth> birthList = admin.birthList;
if (birthList == null) throw new NullPointerException("birthList is null!");
birthList.add(list1);
आप अलग-अलग पंक्तियों में अलग-अलग आमंत्रणों को भी अलग कर सकते हैं ताकि आपके पास यह जानने के लिए पर्याप्त पंक्ति संख्या हो कि कौन सा संदर्भ शून्य है।
List<Birth> birthList = admin.birthList; // If NPE line points here, then admin is null.
birthList.add(list1); // If NPE line points here, then birthList is null.