जवाबों:
जब आप एक संदर्भ चर (यानी एक वस्तु) घोषित करते हैं तो आप वास्तव में एक ऑब्जेक्ट के लिए एक पॉइंटर बना रहे हैं। निम्नलिखित कोड पर विचार करें जहां आप आदिम प्रकार का एक चर घोषित करते हैं 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 मैं सीधे इस जवाब को संपादित करने की अनुमति नहीं है, शायद लेखक इसे जोड़ सकते हैं?)
NullPointerException
s अपवाद हैं जो तब होते हैं जब आप एक संदर्भ का उपयोग करने की कोशिश करते हैं जो स्मृति (शून्य) में कोई स्थान नहीं बताता है, क्योंकि यह एक ऑब्जेक्ट को संदर्भित कर रहा था। अशक्त संदर्भ पर एक विधि को कॉल करना या अशक्त संदर्भ के एक क्षेत्र तक पहुंचने की कोशिश करना एक ट्रिगर होगा NullPointerException
। ये सबसे आम हैं, लेकिन अन्य तरीके NullPointerException
javadoc पेज पर सूचीबद्ध हैं ।
संभवतया सबसे तेज उदाहरण कोड मैं यह बता सकता हूं NullPointerException
:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
पहली पंक्ति के अंदर main
, मैं स्पष्ट रूप से इसके बराबर Object
संदर्भ सेट कर रहा हूं । इसका मतलब है कि मेरे पास एक संदर्भ है, लेकिन यह किसी भी वस्तु की ओर इशारा नहीं कर रहा है। उसके बाद, मैं संदर्भ का इलाज करने की कोशिश करता हूं, हालांकि यह उस पर एक विधि को कॉल करके किसी ऑब्जेक्ट को इंगित करता है। इसका परिणाम यह होता है कि उस स्थान पर निष्पादित करने के लिए कोई कोड नहीं है जो संदर्भ इंगित कर रहा है।obj
null
NullPointerException
(यह एक तकनीकीता है, लेकिन मुझे लगता है कि यह उल्लेख करता है: एक संदर्भ जो अशक्त करने के लिए इंगित करता है, एक सी सूचक के समान नहीं है जो एक अमान्य मेमोरी स्थान को इंगित करता है। एक शून्य सूचक का शाब्दिक अर्थ कहीं भी इंगित नहीं है , जो सूक्ष्म रूप से भिन्न है। उस स्थान की ओर इशारा करना जो अमान्य होता है।)
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
और का उपयोग करें@Nullable
if("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
अशक्त था। कीवर्ड ठीक है। यह जानना कि इसके खिलाफ चौकसी कैसी है। यह इसकी एक सामान्य घटना और इसे कम करने के तरीके प्रदान करता है।