स्थानीय चरों के पीछे का विचार यह है कि वे केवल उस सीमित दायरे के अंदर मौजूद हैं जिसके लिए उनकी आवश्यकता है। जैसे, मूल्य के रूप में अनिश्चितता के लिए बहुत कम कारण होना चाहिए, या कम से कम, वह मूल्य कहां से आ रहा है। मैं स्थानीय चर के लिए डिफ़ॉल्ट मान होने से उत्पन्न होने वाली कई त्रुटियों की कल्पना कर सकता हूं।
उदाहरण के लिए, निम्नलिखित सरल कोड पर विचार करें ... ( NB हमें प्रदर्शन उद्देश्यों के लिए मान लें कि स्थानीय चर एक डिफ़ॉल्ट मान निर्दिष्ट किए गए हैं, जैसा कि निर्दिष्ट किया गया है, यदि स्पष्ट रूप से आरंभिक नहीं है )
System.out.println("Enter grade");
int grade = new Scanner(System.in).nextInt(); //I won't bother with exception handling here, to cut down on lines.
char letterGrade; //let us assume the default value for a char is '\0'
if (grade >= 90)
letterGrade = 'A';
else if (grade >= 80)
letterGrade = 'B';
else if (grade >= 70)
letterGrade = 'C';
else if (grade >= 60)
letterGrade = 'D';
else
letterGrade = 'F';
System.out.println("Your grade is " + letterGrade);
जब सब कहा और किया जाता है, तो मान लेते हैं कि संकलक ने पत्र \ _ को डिफ़ॉल्ट मान निर्दिष्ट किया है , यह कोड ठीक से काम करेगा। हालाँकि, अगर हम दूसरे कथन को भूल गए तो क्या होगा?
हमारे कोड का परीक्षण रन निम्नलिखित में हो सकता है
Enter grade
43
Your grade is
यह परिणाम, जबकि उम्मीद की जा रही थी, निश्चित रूप से कोडर का इरादा नहीं था। वास्तव में, संभवतः अधिकांश मामलों में (या कम से कम, एक महत्वपूर्ण संख्या), डिफ़ॉल्ट मान वांछित मूल्य नहीं होगा , इसलिए अधिकांश मामलों में डिफ़ॉल्ट मान में त्रुटि होगी। कोडर को मजबूर करने के लिए इसका उपयोग करने से पहले एक स्थानीय चर के लिए एक प्रारंभिक मान निर्दिष्ट करने के लिए अधिक समझ में आता है, क्योंकि डीबगिंग दु: ख = 1
को for(int i = 1; i < 10; i++)
दूर करने की सुविधा में भूल जाने के कारण अंदर शामिल करने की सुविधा नहीं = 0
है for(int i; i < 10; i++)
।
यह सच है कि ट्राइ-कैच-अंत में ब्लॉक थोड़ा गड़बड़ हो सकता है (लेकिन यह वास्तव में एक कैच -22 नहीं है जैसा कि उद्धरण से पता चलता है), जब उदाहरण के लिए कोई ऑब्जेक्ट अपने कंस्ट्रक्टर में एक चेक किए गए अपवाद को फेंकता है, फिर भी एक के लिए कारण या कोई अन्य, अंत में ब्लॉक के अंत में इस ऑब्जेक्ट के लिए कुछ किया जाना चाहिए। इसका एक आदर्श उदाहरण संसाधनों के साथ काम करना है, जिसे बंद किया जाना चाहिए।
अतीत में इसे संभालने का एक तरीका ऐसा हो सकता है ...
Scanner s = null; //declared and initialized to null outside the block. This gives us the needed scope, and an initial value.
try {
s = new Scanner(new FileInputStream(new File("filename.txt")));
int someInt = s.nextInt();
} catch (InputMismatchException e) {
System.out.println("Some error message");
} catch (IOException e) {
System.out.println("different error message");
} finally {
if (s != null) //in case exception during initialization prevents assignment of new non-null value to s.
s.close();
}
हालाँकि, जावा 7 के रूप में, यह अंततः ब्लॉक-टू-रिसोर्स का उपयोग करके आवश्यक नहीं है, जैसे कि।
try (Scanner s = new Scanner(new FileInputStream(new File("filename.txt")))) {
...
...
} catch(IOException e) {
System.out.println("different error message");
}
उस ने कहा, (जैसा कि नाम से पता चलता है) यह केवल संसाधनों के साथ काम करता है।
और जबकि पूर्व उदाहरण थोड़ा भाग्यशाली है, यह शायद ट्राइ-कैच-एंड के रूप में अधिक बोलता है या इन वर्गों को लागू करने की तुलना में स्थानीय चर के बारे में बोलता है और उन्हें कैसे लागू किया जाता है।
यह सच है कि फ़ील्ड्स को एक डिफ़ॉल्ट मान से आरंभ किया जाता है, लेकिन यह थोड़ा अलग है। जब आप कहते हैं, उदाहरण के लिए, int[] arr = new int[10];
जैसे ही आपने इस सरणी को प्रारंभ किया है, ऑब्जेक्ट किसी दिए गए स्थान पर स्मृति में मौजूद है। आइए एक पल के लिए मान लें कि कोई डिफ़ॉल्ट मान नहीं है, लेकिन इसके बजाय प्रारंभिक मूल्य जो भी 1s और 0s की श्रृंखला है, उस समय उस मेमोरी लोकेशन में होता है। इससे कई मामलों में गैर-नियतात्मक व्यवहार हो सकता है।
मान लीजिए हमारे पास ...
int[] arr = new int[10];
if(arr[0] == 0)
System.out.println("Same.");
else
System.out.println("Not same.");
यह पूरी तरह से संभव होगा कि Same.
एक रन Not same.
में प्रदर्शित किया जा सकता है और दूसरे में प्रदर्शित किया जा सकता है। जब आप संदर्भ चर बोलना शुरू करते हैं तो समस्या और भी अधिक गंभीर हो सकती है।
String[] s = new String[5];
परिभाषा के अनुसार, एस के प्रत्येक तत्व को एक स्ट्रिंग (या अशक्त) को इंगित करना चाहिए। हालाँकि, यदि प्रारंभिक मान 0s और 1s की जो भी श्रंखला होती है वह इस मेमोरी लोकेशन पर होती है, यही नहीं इसकी कोई गारंटी नहीं है कि आपको हर बार समान परिणाम मिलेंगे, लेकिन इस बात की भी कोई गारंटी नहीं है कि ऑब्जेक्ट s [0] (यह सार्थक कुछ भी इंगित करता है) यहां तक कि एक स्ट्रिंग है (शायद यह एक खरगोश है : पी )! प्रकार के लिए चिंता की यह कमी जावा जावा को बनाने वाली हर चीज के चेहरे पर उड़ जाएगी। इसलिए जबकि स्थानीय चरों के लिए डिफ़ॉल्ट मानों को सर्वोत्तम रूप में वैकल्पिक रूप में देखा जा सकता है, उदाहरण के चर के लिए डिफ़ॉल्ट मान एक आवश्यकता के करीब है ।