जवाबों:
जब आप एक संदर्भ चर (यानी एक वस्तु) घोषित करते हैं तो आप वास्तव में एक ऑब्जेक्ट के लिए एक पॉइंटर बना रहे हैं। निम्नलिखित कोड पर विचार करें जहां आप आदिम प्रकार का एक चर घोषित करते हैं int:
int x;
x = 10;
इस उदाहरण में, चर xएक है intऔर जावा इसे आपके लिए इनिशियलाइज़ करेगा 0। जब आप इसे 10दूसरी पंक्ति का मान प्रदान करते हैं, तो आपका मान 10उस मेमोरी लोकेशन में लिखा जाता है, जिसके द्वारा संदर्भित किया जाता है x।
लेकिन, जब आप एक संदर्भ प्रकार घोषित करने की कोशिश करते हैं , तो कुछ अलग होता है। निम्नलिखित कोड लें:
Integer num;
num = new Integer(10);
पहली पंक्ति एक चर नाम की घोषणा करती है num, लेकिन इसमें वास्तव में एक आदिम मूल्य नहीं होता है। इसके बजाय, इसमें एक सूचक होता है (क्योंकि प्रकार Integerजो एक संदर्भ प्रकार है)। चूँकि आपने अभी तक यह नहीं बताया है कि जावा nullकिस ओर इशारा करता है, जिसका अर्थ है " मैं कुछ नहीं करने का इशारा कर रहा हूँ "।
दूसरी पंक्ति में, newकीवर्ड का उपयोग ऑब्जेक्ट के प्रकार (या बनाने) के लिए किया जाता है Integerऔर पॉइंटर चर numको उस Integerऑब्जेक्ट को सौंपा जाता है ।
ऐसा NullPointerExceptionतब होता है जब आप एक चर घोषित करते हैं, लेकिन एक वस्तु नहीं बनाते हैं और चर की सामग्री का उपयोग करने की कोशिश करने से पहले चर को निर्दिष्ट करते हैं (जिसे डेरेफेरिंग कहा जाता है )। तो आप एक ऐसी चीज की ओर इशारा कर रहे हैं जो वास्तव में मौजूद नहीं है।
डेरेफ्रेंसिंग आमतौर पर .एक विधि या क्षेत्र का उपयोग [करने के लिए , या किसी सरणी को अनुक्रमित करने के लिए उपयोग करते समय होता है ।
यदि आप numउस वस्तु को बनाने से पहले विचलन करने का प्रयास करते हैं जो आपको मिलती है NullPointerException। सबसे तुच्छ मामलों में, कंपाइलर समस्या को पकड़ लेगा और आपको बता देगा कि " num may not have been initialized," लेकिन कभी-कभी आप कोड लिख सकते हैं जो सीधे ऑब्जेक्ट नहीं बनाता है।
उदाहरण के लिए, आपके पास एक विधि हो सकती है:
public void doSomething(SomeObject obj) {
//do something to obj
}
जिस स्थिति में, आप ऑब्जेक्ट नहीं बना रहे हैं obj, बल्कि यह मानते हुए कि doSomething()विधि को कॉल करने से पहले बनाया गया था। ध्यान दें, इस तरह से विधि को कॉल करना संभव है:
doSomething(null);
जो मामले में, objहै null। यदि विधि को पास-इन ऑब्जेक्ट के लिए कुछ करने का इरादा है, तो इसे फेंकना उचित है NullPointerExceptionक्योंकि यह एक प्रोग्रामर त्रुटि है और प्रोग्रामर को डीबगिंग उद्देश्यों के लिए उस जानकारी की आवश्यकता होगी। कृपया अपवाद संदेश में ऑब्जेक्ट चर का नाम शामिल करें, जैसे
Objects.requireNonNull(a, "a");
वैकल्पिक रूप से, ऐसे मामले हो सकते हैं जहां विधि का उद्देश्य केवल ऑब्जेक्ट में पारित होने पर काम करना नहीं है, और इसलिए एक शून्य पैरामीटर स्वीकार्य हो सकता है। इस मामले में, आपको अशक्त पैरामीटर की जांच करने और अलग तरह से व्यवहार करने की आवश्यकता होगी । आपको यह भी प्रलेखन में स्पष्ट करना चाहिए। उदाहरण के लिए, के doSomething()रूप में लिखा जा सकता है:
/**
* @param obj An optional foo for ____. May be null, in which case
* the result will be ____.
*/
public void doSomething(SomeObject obj) {
if(obj == null) {
//do something
} else {
//do something else
}
}
अंत में, स्टैक ट्रेस का उपयोग करके अपवाद और कारण को कैसे इंगित करें
कारण निर्धारित करने के लिए किन तरीकों / साधनों का उपयोग किया जा सकता है ताकि आप कार्यक्रम को समय से पहले समाप्त करने से अपवाद को रोक सकें?
सोनबर फाइंडबग्स के साथ एनपीई का पता लगा सकता है। क्या सोनार JVM के कारण शून्य सूचक अपवादों को पकड़ सकता है
int a=bअगर b एक है तो NPE फेंक सकता है Integer। ऐसे मामले हैं जहां यह डिबग करने के लिए भ्रमित है।
NullPointerExceptionअपने कोड में समस्याओं से बचने का एक अतिरिक्त तरीका उपयोग @Nullableऔर @NotNullएनोटेशन है। निम्नलिखित उत्तर में इस पर अधिक जानकारी है। हालाँकि यह उत्तर विशिष्ट रूप से IntelliJ IDE के बारे में है, यह अन्य उपकरणों पर भी लागू होता है क्योंकि यह टिप्पणियों से स्पष्ट है। (BTW मैं सीधे इस जवाब को संपादित करने की अनुमति नहीं है, शायद लेखक इसे जोड़ सकते हैं?)
NullPointerExceptions अपवाद हैं जो तब होते हैं जब आप एक संदर्भ का उपयोग करने की कोशिश करते हैं जो स्मृति (शून्य) में कोई स्थान नहीं बताता है, क्योंकि यह एक ऑब्जेक्ट को संदर्भित कर रहा था। अशक्त संदर्भ पर एक विधि को कॉल करना या अशक्त संदर्भ के एक क्षेत्र तक पहुंचने की कोशिश करना एक ट्रिगर होगा NullPointerException। ये सबसे आम हैं, लेकिन अन्य तरीके NullPointerExceptionjavadoc पेज पर सूचीबद्ध हैं ।
संभवतया सबसे तेज उदाहरण कोड मैं यह बता सकता हूं NullPointerException:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
पहली पंक्ति के अंदर main, मैं स्पष्ट रूप से इसके बराबर Objectसंदर्भ सेट कर रहा हूं । इसका मतलब है कि मेरे पास एक संदर्भ है, लेकिन यह किसी भी वस्तु की ओर इशारा नहीं कर रहा है। उसके बाद, मैं संदर्भ का इलाज करने की कोशिश करता हूं, हालांकि यह उस पर एक विधि को कॉल करके किसी ऑब्जेक्ट को इंगित करता है। इसका परिणाम यह होता है कि उस स्थान पर निष्पादित करने के लिए कोई कोड नहीं है जो संदर्भ इंगित कर रहा है।objnullNullPointerException
(यह एक तकनीकीता है, लेकिन मुझे लगता है कि यह उल्लेख करता है: एक संदर्भ जो अशक्त करने के लिए इंगित करता है, एक सी सूचक के समान नहीं है जो एक अमान्य मेमोरी स्थान को इंगित करता है। एक शून्य सूचक का शाब्दिक अर्थ कहीं भी इंगित नहीं है , जो सूक्ष्म रूप से भिन्न है। उस स्थान की ओर इशारा करना जो अमान्य होता है।)
null से उपयोग करने से पहले किसी अन्य के लिए किसी सदस्य चर को स्पष्ट रूप से प्रारंभ करना भूल जाएगा । स्थानीय चर के साथ, संकलक इस त्रुटि को पकड़ लेगा, लेकिन इस मामले में ऐसा नहीं है। शायद यह आपके उत्तर के लिए एक उपयोगी जोड़ बना देगा?
शुरू करने के लिए एक अच्छी जगह JavaDocs है । उनके पास यह कवर है:
जब कोई एप्लिकेशन किसी ऐसी स्थिति में नल का उपयोग करने का प्रयास करता है, जहां ऑब्जेक्ट की आवश्यकता होती है। इसमें शामिल है:
- अशक्त वस्तु का उदाहरण विधि कहलाना।
- किसी अशक्त वस्तु के क्षेत्र में पहुँच या संशोधन।
- अशक्त की लंबाई लेते हुए जैसे कि यह एक सरणी थी।
- नल के स्लॉट को एक्सेस करना या संशोधित करना जैसे कि वह एक सरणी हो।
- शून्य को फेंकना जैसे कि यह एक फेंकने योग्य मूल्य था।
नल ऑब्जेक्ट के अन्य अवैध उपयोगों को इंगित करने के लिए अनुप्रयोगों को इस वर्ग के उदाहरणों को फेंकना चाहिए।
यह भी मामला है कि यदि आप के साथ एक अशक्त संदर्भ का उपयोग करने का प्रयास करते हैं synchronized, तो यह भी इस अपवाद को फेंक देगा, जेएलएस के अनुसार :
SynchronizedStatement: synchronized ( Expression ) Block
- अन्यथा, यदि अभिव्यक्ति का मूल्य शून्य है, तो एक
NullPointerExceptionफेंक दिया जाता है।
तो आप ए NullPointerException। इसे ठीक कैसे कर सकते हैं? चलो एक सरल उदाहरण लेते हैं जो फेंकता है NullPointerException:
public class Printer {
private String name;
public void setName(String name) {
this.name = name;
}
public void print() {
printString(name);
}
private void printString(String s) {
System.out.println(s + " (" + s.length() + ")");
}
public static void main(String[] args) {
Printer printer = new Printer();
printer.print();
}
}
शून्य मानों को पहचानें
पहला चरण वास्तव में पहचान रहा है कि कौन से मूल्य अपवाद का कारण बन रहे हैं । इसके लिए हमें कुछ डीबगिंग करने की जरूरत है। स्टैकट्रेस पढ़ना सीखना महत्वपूर्ण है । यह आपको दिखाएगा कि अपवाद कहाँ फेंका गया था:
Exception in thread "main" java.lang.NullPointerException
at Printer.printString(Printer.java:13)
at Printer.print(Printer.java:9)
at Printer.main(Printer.java:19)
यहाँ, हम देखते हैं कि अपवाद पंक्ति 13 ( printStringविधि में) पर फेंका गया है । रेखा को देखें और जांचें कि लॉगिंग स्टेटमेंट जोड़कर या डीबगर का उपयोग करके कौन से मान शून्य हैं । हमें पता चलता है कि sयह अशक्त है, और इस lengthपर विधि को कॉल करना अपवाद को फेंकता है। हम देख सकते हैं कि प्रोग्राम को अपवाद को फेंकना बंद हो जाता है जब s.length()विधि से हटा दिया जाता है।
ट्रेस जहां इन मूल्यों से आते हैं
अगली जाँच करें कि यह मान कहाँ से आया है। विधि की कॉल का पालन करके, हम देखते हैं कि sसाथ में पारित हो जाता है printString(name)में print()विधि, और this.nameरिक्त है।
ट्रेस जहां इन मूल्यों को सेट किया जाना चाहिए
कहां this.nameसेट है? में setName(String)विधि। कुछ और डीबगिंग के साथ, हम देख सकते हैं कि इस पद्धति को बिल्कुल नहीं कहा जाता है। अगर विधि बुलाया गया था, जांच करना न भूलें आदेश है कि इन तरीकों कहा जाता है और सेट विधि नहीं बुलाया जाता है के बाद प्रिंट विधि।
यह हमें एक समाधान देने के लिए पर्याप्त है: कॉल करने printer.setName()से पहले एक कॉल जोड़ें printer.print()।
चर का डिफ़ॉल्ट मानsetName हो सकता है (और इसे शून्य पर सेट होने से रोका जा सकता है):
private String name = "";
उदाहरण के लिए, printया तो printStringविधि शून्य के लिए जाँच कर सकती है :
printString((name == null) ? "" : name);
या आप वर्ग को डिजाइन कर सकते हैं ताकि name हमेशा एक अशक्त मान हो :
public class Printer {
private final String name;
public Printer(String name) {
this.name = Objects.requireNonNull(name);
}
public void print() {
printString(name);
}
private void printString(String s) {
System.out.println(s + " (" + s.length() + ")");
}
public static void main(String[] args) {
Printer printer = new Printer("123");
printer.print();
}
}
यह सभी देखें:
यदि आपने समस्या को डीबग करने का प्रयास किया है और अभी भी आपके पास समाधान नहीं है, तो आप अधिक सहायता के लिए एक प्रश्न पोस्ट कर सकते हैं, लेकिन यह सुनिश्चित करें कि आपने अब तक जो भी प्रयास किया है उसे शामिल करें। कम से कम, प्रश्न में स्टैकट्रेस शामिल करें , और कोड में महत्वपूर्ण पंक्ति संख्याओं को चिह्नित करें । इसके अलावा, पहले कोड को सरल बनाने का प्रयास करें ( SSCCE देखें )।
NullPointerException(NPE)?आपको पता होना चाहिए के रूप में, जावा प्रकार में विभाजित हैं आदिम प्रकार ( boolean, intआदि) और संदर्भ प्रकार । जावा में संदर्भ प्रकार आपको विशेष मूल्य का उपयोग करने की अनुमति देते हैं nullजो "नो ऑब्जेक्ट" कहने का जावा तरीका है।
एक NullPointerExceptionजब भी अपने कार्यक्रम के प्रयास एक का उपयोग करने के क्रम में फेंक दिया जाता है nullजैसे कि यह एक वास्तविक संदर्भ था। उदाहरण के लिए, यदि आप इसे लिखते हैं:
public class Test {
public static void main(String[] args) {
String foo = null;
int length = foo.length(); // HERE
}
}
"HERE" लेबल वाला कथन length()एक nullसंदर्भ पर विधि को चलाने का प्रयास करने वाला है , और यह एक फेंक देगा NullPointerException।
ऐसे कई तरीके हैं जो आप एक nullमूल्य का उपयोग कर सकते हैं जिसके परिणामस्वरूप एक होगा NullPointerException। वास्तव में, केवल चीजें जो आप बिना एनपीई के बिना कर सकते हैं nullवे हैं:
==या !=ऑपरेटरों, या का उपयोग कर यह परीक्षण instanceof।मान लीजिए कि मैं कार्यक्रम को संकलित करता हूं और ऊपर चलाता हूं:
$ javac Test.java
$ java Test
Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:4)
$
पहला अवलोकन: संकलन सफल हुआ! कार्यक्रम में समस्या संकलन त्रुटि नहीं है। यह एक रनटाइम त्रुटि है। (कुछ आईडीई चेतावनी दे सकते हैं कि आपका कार्यक्रम हमेशा एक अपवाद फेंक देगा ... लेकिन मानक javacसंकलक नहीं करता है।)
दूसरा अवलोकन: जब मैं कार्यक्रम चलाता हूं, तो यह "gobbledy-gook" की दो पंक्तियों को आउटपुट करता है। गलत!! वह गुदगुदी-गोक नहीं है। यह एक स्टैकट्रेस है ... और यह महत्वपूर्ण जानकारी प्रदान करता है जो आपको अपने कोड में त्रुटि को ट्रैक करने में मदद करेगा यदि आप इसे ध्यान से पढ़ने के लिए समय लेते हैं।
तो आइए देखें कि यह क्या कहता है:
Exception in thread "main" java.lang.NullPointerException
स्टैक ट्रेस की पहली पंक्ति आपको कई चीजें बताती है:
java.lang.NullPointerException।NullPointerExceptionइस संबंध में असामान्य है, क्योंकि इसमें शायद ही कोई त्रुटि संदेश है।एनपीई के निदान में दूसरी पंक्ति सबसे महत्वपूर्ण है।
at Test.main(Test.java:4)
यह हमें कई बातें बताता है:
mainविधि में थे Test।यदि आप ऊपर फ़ाइल में लाइनें गिनते हैं, तो पंक्ति 4 वह है जिसे मैंने "यहां" टिप्पणी के साथ लेबल किया है।
ध्यान दें कि अधिक जटिल उदाहरण में, एनपीई स्टैक ट्रेस में बहुत सारी लाइनें होंगी। लेकिन आप यह सुनिश्चित कर सकते हैं कि दूसरी पंक्ति (पहली "एट" लाइन) आपको बताएगी कि एनपीई 1 कहां फेंका गया था ।
संक्षेप में, स्टैक ट्रेस हमें स्पष्ट रूप से बताएगा कि कार्यक्रम के किस कथन ने एनपीई को फेंक दिया है।
1 - बिल्कुल सच नहीं है। नेस्टेड अपवाद नामक चीजें हैं ...
यह कठिन भाग है। संक्षिप्त उत्तर स्टैक ट्रेस, स्रोत कोड और प्रासंगिक API दस्तावेज़ीकरण द्वारा प्रदान किए गए साक्ष्य के तार्किक तर्क को लागू करना है।
आइए पहले सरल उदाहरण (ऊपर) से स्पष्ट करें। हम उस रेखा को देखकर शुरू करते हैं जो स्टैक ट्रेस ने हमें बताया है कि एनपीई कहां हुआ है:
int length = foo.length(); // HERE
कैसे एक NPE फेंक सकते हैं?
वास्तव में, केवल एक ही तरीका है: यह केवल तभी हो सकता fooहै जब मूल्य हो null। हम तो length()विधि को चलाने की कोशिश करते हैं nullऔर ... बैंग!
लेकिन (मैं आपको कहता सुनता हूं) क्या होगा अगर एनपीई को length()विधि कॉल के अंदर फेंक दिया गया था ?
ठीक है, अगर ऐसा हुआ, तो स्टैक ट्रेस अलग दिखाई देगा। पहली "एट" लाइन कहेगी कि अपवाद को java.lang.Stringक्लास में किसी लाइन में फेंक दिया गया था और 4 की लाइन Test.javaदूसरी "लाइन" पर होगी।
तो यह कहां nullसे आया? इस मामले में, यह स्पष्ट है, और यह स्पष्ट है कि इसे ठीक करने के लिए हमें क्या करने की आवश्यकता है। (एक गैर-शून्य मान असाइन करें foo।)
ठीक है, तो चलिए थोड़ा और मुश्किल उदाहरण पेश करते हैं। इसके लिए कुछ तार्किक कटौती की आवश्यकता होगी ।
public class Test {
private static String[] foo = new String[2];
private static int test(String[] bar, int pos) {
return bar[pos].length();
}
public static void main(String[] args) {
int length = test(foo, 1);
}
}
$ javac Test.java
$ java Test
Exception in thread "main" java.lang.NullPointerException
at Test.test(Test.java:6)
at Test.main(Test.java:10)
$
तो अब हमारे पास दो "एट" लाइनें हैं। इस लाइन के लिए पहला है:
return args[pos].length();
और दूसरा इस लाइन के लिए है:
int length = test(foo, 1);
पहली पंक्ति को देखते हुए, यह एक NPE कैसे फेंक सकता है? इसके दो तरीके हैं:
barहै nullतो bar[pos]एक NPE फेंक देंगे।bar[pos], nullतो उस length()पर कॉल करने से एनपीई फेंक देगा।इसके बाद, हमें यह पता लगाने की जरूरत है कि वास्तव में क्या हो रहा है। हम पहले वाले की खोज शुरू करेंगे:
कहाँ barसे आता है? यह testमेथड कॉल का एक पैरामीटर है , और अगर हम testदेखें कि कैसे बुलाया जाता है, तो हम देख सकते हैं कि यह fooस्टैटिक वेरिएबल से आता है । इसके अलावा, हम स्पष्ट रूप से देख सकते हैं कि हमने fooगैर-शून्य मान के लिए इनिशियलाइज़ किया है। जो इस स्पष्टीकरण को अस्थायी रूप से खारिज करने के लिए पर्याप्त है। (सिद्धांत में, कुछ और बदल सकता fooहै null... लेकिन यहां ऐसा नहीं हो रहा है।)
तो हमारे दूसरे परिदृश्य के बारे में क्या? ठीक है, हम देख सकते हैं कि posहै 1, तो इसका मतलब है कि foo[1]होना चाहिए null। क्या यह संभव है?
वास्तव में यह है! और यही समस्या है। जब हम इस तरह की शुरुआत करते हैं:
private static String[] foo = new String[2];
हम ऐसे String[]दो तत्वों के साथ आवंटित करते हैं, जिन्हें आरंभिक किया जाता हैnull । उसके बाद, हमने foo... की सामग्री को नहीं बदला foo[1]है null।
यह ऐसा है जैसे आप किसी वस्तु तक पहुंचने का प्रयास कर रहे हैं null। नीचे दिए गए उदाहरण पर विचार करें:
TypeA objA;
इस समय आपने केवल इस ऑब्जेक्ट को घोषित किया है, लेकिन आरंभिक या त्वरित नहीं । और जब भी आप इसमें किसी संपत्ति या विधि का उपयोग करने का प्रयास करेंगे, तो यह फेंक देगा NullPointerExceptionजो समझ में आता है।
इस नीचे दिए गए उदाहरण को देखें:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
एक नल पॉइंटर अपवाद तब फेंका जाता है जब कोई एप्लिकेशन किसी ऐसे मामले में नल का उपयोग करने का प्रयास करता है जहां एक वस्तु की आवश्यकता होती है। इसमें शामिल है:
nullवस्तु की आवृत्ति विधि को कॉल करना ।nullवस्तु के क्षेत्र में पहुँच या संशोधन ।nullमानो यह एक सरणी हो।nullजैसे कि यह एक ऐरे था।nullमानो फेंकने योग्य मूल्य हो।nullऑब्जेक्ट के अन्य अवैध उपयोगों को इंगित करने के लिए अनुप्रयोगों को इस वर्ग के उदाहरणों को फेंकना चाहिए ।
संदर्भ: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
nullएक synchronizedब्लॉक के लक्ष्य के रूप में , 2) का उपयोग कर के nullरूप में switch, और अनबॉक्सिंग के लक्ष्य के रूप में null।
एक nullसूचक वह है जो कहीं नहीं इंगित करता है। जब आप एक पॉइंटर को रोकते हैं p, तो आप कहते हैं "मुझे" पी "में संग्रहीत स्थान पर डेटा दें। जब pएक nullपॉइंटर है, तो इसमें संग्रहीत स्थान pहै nowhere, आप कह रहे हैं" मुझे स्थान 'कहीं' पर डेटा दें। " जाहिर है, यह ऐसा नहीं कर सकता है, इसलिए यह फेंकता है null pointer exception।
सामान्य तौर पर, यह इसलिए है क्योंकि कुछ को ठीक से आरंभ नहीं किया गया है।
NULLलिखा जाता nullहै। और यह एक संवेदनशील मामला है।
यह समझाने के लिए कि यह कैसे होता है और इसे कैसे ठीक किया जाए, बहुत सारे स्पष्टीकरण पहले से मौजूद हैं, लेकिन आपको इन सबसे बचने के लिए सर्वोत्तम प्रथाओं का भी पालन करना चाहिए NullPointerException।
यह भी देखें: सर्वोत्तम प्रथाओं की एक अच्छी सूची
मैं जोड़ूंगा, बहुत महत्वपूर्ण है, finalसंशोधक का अच्छा उपयोग करें ।
जावा में लागू होने पर "अंतिम" संशोधक का उपयोग करना
सारांश:
finalअच्छी आरंभीकरण लागू करने के लिए संशोधक का उपयोग करें ।@NotNullऔर का उपयोग करें@Nullableif("knownObject".equals(unknownObject)valueOf()अधिक toString()।StringUtilsतरीकों का उपयोग करें StringUtils.isEmpty(null)।@Nullableऊपर सूचीबद्ध) के आधार पर स्वचालित अशक्त एनालिसिस की पेशकश करते हैं और संभावित त्रुटियों के बारे में चेतावनी देते हैं। मौजूदा कोड संरचना के आधार पर इस तरह के एनोटेशन का अनुमान लगाना और उत्पन्न करना संभव है (जैसे इंटेलीजे ऐसा कर सकते हैं)।
if (obj==null)। यदि यह अशक्त है तो आपको उसे भी संभालने के लिए कोड लिखना चाहिए।
जावा में, सब कुछ (आदिम प्रकारों को छोड़कर) एक वर्ग के रूप में है।
यदि आप किसी वस्तु का उपयोग करना चाहते हैं तो आपके पास दो चरण हैं:
उदाहरण:
Object object;object = new Object();सरणी अवधारणा के लिए भी:
Item item[] = new Item[5];item[0] = new Item();यदि आप इनिशियलाइज़ेशन सेक्शन नहीं दे रहे हैं तो NullPointerExceptionउठें।
एक नल सूचक अपवाद एक संकेतक है जिसे आप किसी ऑब्जेक्ट का उपयोग कर रहे हैं इसे प्रारंभ किए बिना।
उदाहरण के लिए, नीचे एक छात्र वर्ग है जो हमारे कोड में इसका उपयोग करेगा।
public class Student {
private int id;
public int getId() {
return this.id;
}
public setId(int newId) {
this.id = newId;
}
}
नीचे दिया गया कोड आपको एक शून्य सूचक अपवाद देता है।
public class School {
Student student;
public School() {
try {
student.getId();
}
catch(Exception e) {
System.out.println("Null pointer exception");
}
}
}
क्योंकि आप उपयोग कर रहे हैं student, लेकिन आप इसे नीचे दिए गए सही कोड की तरह शुरू करना भूल गए:
public class School {
Student student;
public School() {
try {
student = new Student();
student.setId(12);
student.getId();
}
catch(Exception e) {
System.out.println("Null pointer exception");
}
}
}
में जावा सभी चर आप यह घोषणा वास्तव में खुद को वस्तुओं रहे हैं वस्तुओं (या पुरातन) करने के लिए "संदर्भ" और नहीं।
जब आप किसी ऑब्जेक्ट विधि को निष्पादित करने का प्रयास करते हैं, तो संदर्भ उस ऑब्जेक्ट को निष्पादित करने के लिए जीवित ऑब्जेक्ट से पूछता है। लेकिन अगर संदर्भ NULL (शून्य, शून्य, शून्य) का संदर्भ दे रहा है, तो कोई तरीका नहीं है जिससे विधि निष्पादित हो जाती है। तब रनटाइम आपको NullPointerException को फेंकने से यह पता चलता है।
आपका संदर्भ अशक्त करने के लिए "इंगित" कर रहा है, इस प्रकार "नल -> सूचक"।
ऑब्जेक्ट VM मेमोरी स्पेस में रहता है और इसे एक्सेस करने का एकमात्र तरीका thisसंदर्भों का उपयोग कर रहा है । इस उदाहरण को लें:
public class Some {
private int id;
public int getId(){
return this.id;
}
public setId( int newId ) {
this.id = newId;
}
}
और अपने कोड में किसी अन्य स्थान पर:
Some reference = new Some(); // Point to a new object of type Some()
Some otherReference = null; // Initiallly this points to NULL
reference.setId( 1 ); // Execute setId method, now private var id is 1
System.out.println( reference.getId() ); // Prints 1 to the console
otherReference = reference // Now they both point to the only object.
reference = null; // "reference" now point to null.
// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );
// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...
यह जानने के लिए एक महत्वपूर्ण बात है - जब किसी वस्तु के संदर्भ नहीं होते हैं (ऊपर के उदाहरण में जब referenceऔर जब otherReferenceदोनों को इंगित करते हैं) तब ऑब्जेक्ट "अगम्य" होता है। हमारे पास इसके साथ काम करने का कोई तरीका नहीं है, इसलिए यह ऑब्जेक्ट कचरा एकत्र करने के लिए तैयार है, और कुछ बिंदु पर, वीएम इस ऑब्जेक्ट द्वारा उपयोग की जाने वाली मेमोरी को मुक्त कर देगा और दूसरे को आवंटित करेगा।
एक और घटना NullPointerExceptionतब घटित होती है जब कोई वस्तु सरणी घोषित करता है, तो तुरंत उसके अंदर तत्वों को हटाने की कोशिश करता है।
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
यदि तुलना क्रम को उलट दिया जाता है तो इस विशेष NPE से बचा जा सकता है; अर्थात्, .equalsगारंटीकृत गैर-शून्य ऑब्जेक्ट पर उपयोग करें ।
एक सरणी के अंदर सभी तत्वों को उनके सामान्य प्रारंभिक मूल्य के लिए आरंभीकृत किया जाता है ; किसी भी प्रकार के ऑब्जेक्ट ऐरे के लिए, इसका मतलब है कि सभी तत्व हैं null।
आपको ऐक्सेस या डीफ़रेंसिंग करने से पहले एरे में तत्वों को इनिशियलाइज़ करना होगा ।
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Optionalअशक्त था। कीवर्ड ठीक है। यह जानना कि इसके खिलाफ चौकसी कैसी है। यह इसकी एक सामान्य घटना और इसे कम करने के तरीके प्रदान करता है।