what is nullpointerexception java how avoid it
यह ट्यूटोरियल जावा में NullPointerException के बारे में बताएगा। हम अशक्त सूचक अपवाद के कारणों और उससे बचने के तरीकों पर चर्चा करेंगे:
जावा में NullPointerException एक रनटाइम अपवाद है। जावा एक वस्तु संदर्भ के लिए एक विशेष अशक्त मान प्रदान करता है। जब कोई प्रोग्राम शून्य मान पर सेट ऑब्जेक्ट संदर्भ का उपयोग करने की कोशिश करता है, तो यह अपवाद फेंक दिया जाता है।
=> यहाँ सरल जावा प्रशिक्षण श्रृंखला देखें।
आप क्या सीखेंगे:
NullPointerException Java में
यदि शून्य मान वाला कोई ऑब्जेक्ट संदर्भ NullPointerException को फेंकता है, तो हमें शून्य मान की आवश्यकता क्यों है?
शून्य मान आमतौर पर यह इंगित करने के लिए उपयोग किया जाता है कि कोई मान किसी संदर्भ चर को असाइन नहीं किया गया है। दूसरे, हमें शून्य नोड्स को इंगित करने के लिए लिंक की गई सूचियों और पेड़ों जैसे संग्रह के लिए अशक्त मूल्यों की आवश्यकता है। सिंगलटन पैटर्न जैसे डिजाइन पैटर्न अशक्त मूल्यों का उपयोग करते हैं।
निष्कर्ष निकालने के लिए, जावा में शून्य मान के कई उपयोग हैं। Null Pointer Exception जावा में विशिष्ट परिदृश्यों में डाली गई है।
कुछ परिदृश्य इस प्रकार हैं:
- एक अशक्त वस्तु का उपयोग करते हुए विधि।
- किसी फ़ील्ड या डेटा सदस्य को शून्य ऑब्जेक्ट तक पहुँचना या संशोधित करना।
- एक विधि के तर्क के रूप में अशक्त वस्तु को पास करना।
- एक अशक्त सरणी की लंबाई की गणना।
- अशक्त सरणी का अनुक्रमणिका अनुक्रमण।
- एक अशक्त वस्तु को सिंक्रनाइज़ करना।
- एक अशक्त वस्तु फेंकना।
नल सूचक अपवाद RuntimeException वर्ग से फैली हुई है।
NullPointerException की पदानुक्रम नीचे दी गई है।
जैसा कि उपर्युक्त पदानुक्रम में दिखाया गया है, नल सूचक अपवाद RuntimeException से प्राप्त होता है जो अपवाद वर्ग को विरासत में मिला है। बदले में अपवाद वर्ग थ्रोएबल क्लास से लिया जाता है जो ऑब्जेक्ट का उपवर्ग है।
Java.lang.NullPointerException घटना के कारण
अब हम NullPointerException घटना के प्रत्येक परिदृश्य को प्रदर्शित करेंगे, जिसे हमने ऊपर सूचीबद्ध किया था।
# 1) एक अशक्त वस्तु का उपयोग करके विधि को लागू किया जाता है
निम्नलिखित कोड उदाहरण पर विचार करें। यहां हमारे पास एक वर्ग है, MyClass जो दो तरीके प्रदान करता है। पहला तरीका first initT ’एक अशक्त वस्तु देता है। मुख्य विधि में, हम initT विधि के लिए कॉल के साथ MyClass की एक वस्तु बनाते हैं।
इसके बाद, हम MyClass की प्रिंट विधि कहते हैं। यहां, java.lang.NullPointerException को फेंक दिया गया है क्योंकि हम एक अशक्त वस्तु का उपयोग करके प्रिंट विधि को कॉल कर रहे हैं।
class MyClass { public static MyClass initT() { //method returns a null object return null; } public void print(String s) { System.out.println(s.toLowerCase()); } } class Main{ public static void main(String() args) { MyClass t = MyClass.initT(); //create a new object (null object) t.print('Hello, World!'); //invoke method using null object } }
उत्पादन
# 2) एक अशक्त वस्तु का पहुंच क्षेत्र
class MyClass { int numField = 100; public static MyClass initT() { //method returns a null object return null; } public void print(String s) { System.out.println(s.toLowerCase()); } } class Main{ public static void main(String() args) { MyClass t = MyClass.initT(); //create a new object (null object) int num = t.numField; //access MyClass member using null object } }
उत्पादन
विंडोज़ पर mkv फ़ाइल कैसे खोलें
यह NullPointerException का एक और कारण है। यहां हम एक अशक्त वस्तु का उपयोग करके एक वर्ग के सदस्य तक पहुंचने का प्रयास करते हैं। हम ऑब्जेक्ट टी के लिए initT मेथड के रिटर्न वैल्यू को असाइन करते हैं और फिर ऑब्जेक्ट टी का उपयोग करके numField तक पहुंचते हैं। लेकिन ऑब्जेक्ट t एक अशक्त वस्तु है क्योंकि initT एक अशक्त वस्तु देता है। इस बिंदु पर, java.lang.NullPointerException को उठाया गया है।
# 3) एक अशक्त वस्तु को तर्क के रूप में पारित करना
यह java.lang.NullPointerException घटना का सामान्य कारण है। निम्नलिखित जावा कार्यक्रम पर विचार करें। यहां हमारे पास एक तरीका है 'Print_LowerCase' जो स्ट्रिंग ऑब्जेक्ट को लोअरकेस में तर्क के रूप में परिवर्तित करता है।
public class Main { public static void print_LowerCase(String s) { System.out.println(s.toLowerCase()); } public static void main(String() args) { print_LowerCase(null); //pass null object as argument to the method } }
उत्पादन
मुख्य विधि में, हम इस विधि को कहते हैं और एक तर्क के रूप में एक अशक्त पास करते हैं। चूंकि स्ट्रिंग ऑब्जेक्ट शून्य नहीं हो सकता है, java.lang.NullPointerException को फेंक दिया गया है।
# 4) अशक्त सरणी की लंबाई प्राप्त करना
एक अशक्त सरणी की लंबाई की गणना करने का प्रयास करने से java.lang.NullPointerException भी फेंकी जा रही है।
नीचे दिया गया कार्यक्रम यह प्रदर्शित करता है।
public class Main { public static void main(String() args) { int() dataArray = null; //Array is null; no data System.out.println('Array Length:' + dataArray.length); //print array length } }
उत्पादन
उपरोक्त कार्यक्रम में, हम एक ऐरे की घोषणा करते हैं और इसे अशक्त करते हैं अर्थात् कोई डेटा नहीं। जब हम इस अशक्त सरणी पर लंबाई की संपत्ति का उपयोग करते हैं, तो NullPointerException को फेंक दिया जाता है।
# 5) एक अशक्त सरणी का एक्सेस इंडेक्स
लंबाई के समान, भले ही हम किसी इंडेक्स का उपयोग करके अशक्त सरणी में मान को एक्सेस करने का प्रयास करते हैं, यह java.lang.NullPointerException का कारण है।
public class Main { public static void main(String() args) { int() dataArray = null; //Array set to null //access value at index 2 System.out.println('Value at index 2:' + dataArray(2)); } }
उत्पादन
उपरोक्त कार्यक्रम में, हम एक शून्य सरणी के सूचकांक 2 पर मूल्य तक पहुंचने का प्रयास करते हैं।
# 6) एक अशक्त वस्तु पर सिंक्रनाइज़ेशन
हम आमतौर पर समवर्ती पहुंच को सुविधाजनक बनाने के लिए एक ब्लॉक या एक विधि को सिंक्रनाइज़ करते हैं। हालाँकि, सिंक्रनाइज़ेशन के लिए हम जिस ऑब्जेक्ट संदर्भ का उपयोग करते हैं, वह शून्य नहीं होना चाहिए। यदि यह एक अशक्त वस्तु है, तो इसका परिणाम java.lang.NullPointerException है।
नीचे दिए गए जावा प्रोग्राम इसे प्रदर्शित करता है। जैसा कि हम देख सकते हैं, हमारे पास एक स्ट्रिंग ऑब्जेक्ट है 'म्यूटेक्स' को शून्य से आरंभ किया गया है। फिर मुख्य फ़ंक्शन में, हम ऑब्जेक्ट संदर्भ के रूप में म्यूटेक्स के साथ एक सिंक्रनाइज़ ब्लॉक का उपयोग करते हैं। जैसा कि म्यूटेक्स null java.lang.NullPointerException है।
public class Main { public static String mutex = null; //mutex variable set to null public static void main(String() args) { synchronized(mutex) { //synchronized block for null mutex System.out.println('synchronized block'); } } }
उत्पादन
# 7) अशक्त फेंकने से
public class Main { public static void main(String() args) { throw null; //throw null } }
आउटपुट:
उपरोक्त उदाहरण कार्यक्रम में, मान्य ऑब्जेक्ट को फेंकने के बजाय, नल को फेंक दिया जाता है। इससे नल सूचक अपवाद होता है।
अशक्त सूचक अपवाद से बचना
अब जब हमने NullPointerException की घटना के कारणों को देखा है, तो हमें अपने कार्यक्रम में इससे बचने की कोशिश करनी चाहिए।
सबसे पहले, हमें यह सुनिश्चित करना चाहिए कि हम अपने कार्यक्रमों में जिन वस्तुओं का उपयोग करते हैं, उन्हें ठीक से आरम्भ किया जाता है ताकि हम अशक्त वस्तुओं के उपयोग से बच सकें, जो अशक्त सूचक अपवाद हैं। हमें यह भी ध्यान रखना चाहिए कि कार्यक्रम में उपयोग किए जाने वाले संदर्भ चर मान्य मानों के लिए इंगित किए जाते हैं और गलती से शून्य मान प्राप्त नहीं करते हैं।
इन विचारों के अलावा, हम java.lang.NullPointerException से बचने के लिए केस-बाय-केस आधार पर अधिक सावधानी बरत सकते हैं।
नीचे हम कुछ मामलों पर विचार करते हैं।
(1) शाब्दिक के साथ स्ट्रिंग तुलना
स्ट्रिंग चर और शाब्दिक (एनम के वास्तविक मूल्य या तत्व) के बीच तुलना जावा कार्यक्रमों में एक बहुत ही सामान्य ऑपरेशन है। लेकिन अगर स्ट्रिंग वैरिएबल है जो ऑब्जेक्ट है, तो इस नॉल ऑब्जेक्ट की तुलना शाब्दिक रूप से NullPointeException फेंक देगा।
तो समाधान स्ट्रिंग वस्तु के बजाय शाब्दिक से तुलना पद्धति को लागू करना है जो शून्य हो सकता है।
निम्नलिखित कार्यक्रम से पता चलता है कि हम कैसे शाब्दिक से तुलना विधियों को लागू कर सकते हैं और java.lang.NullPointerException से बच सकते हैं।
class Main { public static void main (String() args) { // String set to null String myStr = null; // Checking if myStr is null using try catch. try { if ('Hello'.equals(myStr)) //use equals method with literal System.out.print('Two strings are same'); else System.out.print('Strings are not equal'); } catch(NullPointerException e) { System.out.print('Caught NullPointerException'); } } }
उत्पादन
# 2) एक विधि के तर्कों पर जाँच रखें
यह सुनिश्चित करने के लिए विधि के तर्कों की जाँच करें कि वे शून्य मान नहीं हैं। यदि तर्क विनिर्देश के अनुसार नहीं हैं, तो कोड यह इंगित करने के लिए IllegalArgumentException को फेंक देगा कि तर्क अपेक्षा के अनुरूप नहीं हैं।
यह नीचे जावा प्रोग्राम में दिखाया गया है।
import java.io.*; class Main { public static void main (String() args) { // set String to empty value String myStr = ''; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } // Set String to a proper value and call getLength myStr = 'Far from home'; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } // Set String to null and call getLength() myStr = null; try { System.out.println('String value:' + myStr); System.out.println('String Length:' + getLength(myStr)); } catch(IllegalArgumentException e) { System.out.println('Exception: ' + e.getMessage()); } } // Method that returns length of the String public static int getLength(String myStr) { if (myStr == null) //throw Exception if String is null throw new IllegalArgumentException('The String argument cannot be null'); return myStr.length(); } }
उत्पादन
# 3) अशक्त मूल्यों का ध्यान रखने के लिए टर्नेरी संचालक का उपयोग
हम java.lang.NullPointerException से बचने के लिए टर्नेरी ऑपरेटर का उपयोग कर सकते हैं। टर्नरी ऑपरेटर के तीन ऑपरेटर होते हैं। पहला एक बूलियन अभिव्यक्ति है जो सही या गलत का मूल्यांकन करता है। यदि अभिव्यक्ति सही है, तो दूसरा ऑपरेटर लौटाया जाता है या तीसरा ऑपरेटर लौटाया जाता है।
निम्न प्रोग्राम NullPointerException से बचने के लिए एक सहायक ऑपरेटर के उपयोग को दर्शाता है।
import java.io.*; class Main { public static void main (String() args) { // Initialize String with null value String myStr = null; //return a substring for this String using ternary oprator String myVal = (myStr == null) ? '' : myStr.substring(0,5); if(myVal.equals('')) System.out.println('Empty String!!'); else System.out.println('String value: ' + myVal); // Now set a value for String myStr = 'SoftwareTestingHelp'; //return a substring for this String using ternary oprator myVal = (myStr == null) ? '' : myStr.substring(0,8); if(myVal.equals('')) System.out.println('Empty String!!'); else System.out.println('String value: ' + myVal); }
उत्पादन
बार बार पूछे जाने वाले प्रश्न
Q # 1) मैं जावा में NullPointerException को कैसे ठीक करूं?
उत्तर: हमें यह सुनिश्चित करना चाहिए कि कार्यक्रम में उपयोग की जाने वाली सभी वस्तुओं को ठीक से प्रारंभ किया जाए और उनके पास शून्य मान न हों। इसके अलावा, संदर्भ चर में शून्य मान नहीं होना चाहिए।
# 2) NullPointerException की जाँच की गई है या अनियंत्रित है?
उत्तर: NullPointerException चेक किया गया अपवाद नहीं है। यह RuntimeException का वंशज है और अनियंत्रित है।
# 3) मैं NullPointerException को कैसे रोकूं?
उत्तर: NullPointerException से बचने के लिए कुछ सर्वोत्तम अभ्यास हैं:
- बराबर ऑब्जेक्ट () और equalsIgnoreCase () स्ट्रिंग का उपयोग शाब्दिक के साथ अज्ञात वस्तु पर उपयोग करने के बजाय जो शून्य हो सकता है।
- उपयोग करें valueOf () के बजाय toString (); और दोनों समान परिणाम देते हैं।
- Java एनोटेशन @NotNull और @Nullable का उपयोग करें।
# 4) जावा में शून्य मान क्या है?
उत्तर: एक अशक्त मान किसी वस्तु या चर का संदर्भ नहीं देता है। यह एक कीवर्ड और एक शाब्दिक है। यह एक अशक्त संदर्भ का प्रतिनिधित्व करता है।
# 5) क्या हम जावा में NullPointerException को पकड़ सकते हैं?
उत्तर: अपवाद java.lang.NullPointerException एक अनियंत्रित अपवाद है और RuntimeException वर्ग का विस्तार करता है। इसलिए प्रोग्रामर को इसे पकड़ने के लिए कोई बाध्यता नहीं है।
निष्कर्ष
इस ट्यूटोरियल में, हमने जावा में NullPointerException पर चर्चा की है। यह काफी खतरनाक अपवाद है और आमतौर पर पॉप अप हो सकता है जब हम कम से कम इसकी उम्मीद करते हैं। नल सूचक अपवाद ज्यादातर अशक्त वस्तु या अशक्त संदर्भ के कारण होता है। हमने NullPointerException से बचने के कारणों और तरीकों को पहले ही देख लिया है।
जहां तक संभव हो, प्रोग्रामर को एक कार्यक्रम में नल सूचक अपवाद की घटना से बचने की कोशिश करनी चाहिए। जैसा कि यह एक अनियंत्रित रनटाइम अपवाद है, हमें यह देखना चाहिए कि जब एप्लिकेशन चल रहा हो तो ऐसा न हो।
=> स्क्रैच से जावा सीखने के लिए यहां जाएं।
अनुशंसित पाठ
- उदाहरणों के साथ जावा अपवाद और अपवाद हैंडलिंग
- जावा में ArrayIndexOutOfBoundsException कैसे संभालें?
- कोड उदाहरणों के साथ C # अपवाद हैंडलिंग ट्यूटोरियल
- पूरा गाइड पीएल SQL अपवाद हैंडलिंग उदाहरण के साथ
- SoapUI Groovy लिपियों में अपवाद को कैसे हैंडल करें - SoapUI Tutorial # 11
- अजगर को छोड़कर प्रयास करें - उदाहरण के साथ पायथन हैंडलिंग अपवाद
- JDBC अपवाद हैंडलिंग - SQL अपवाद को कैसे हैंडल करें
- C ++ में अपवाद हैंडलिंग