2016-07-11 5 views
5

तो हम जानते हैं कि यदि स्थानीय निर्माण में उपयोग किया जाता है तो इसका उपयोग करने के लिए स्थानीय चर को प्रारंभ करना होगा। उदाहरण के तौर पर, निम्न कोड संकलित नहीं होगा।यदि कोई स्थानीय चर वैरिएबल में शुरू होता है - अन्यथा क्यों नहीं, लेकिन अगर नहीं - तो अगर संरचना हो?

public class Test { 
    public static void main (String...args){ 
     double price= 11; 
     String model ; 
     if (price>10) 
     {model ="smartphone";} 
     else if (price<=11) 
     {model="not smart phone";} 
     System.out.println(model); 
    } 
} 

लेकिन, यदि आप else को else if (price<=11) बदलने के लिए या कुछ यादृच्छिक मूल्य के लिए स्थानीय चर स्ट्रिंग मॉडल को प्रारंभ, कोड सफलतापूर्वक संकलित कर देगा। इस मामले में मेरा सवाल है "क्यों?"

अब, यह एक पुस्तक से एक सवाल था और विवरण था:।

"स्थानीय चर मॉडल केवल घोषित किया जाता है, आरंभ नहीं चर मॉडल के प्रारंभ के भीतर रखा जाता है, तो और कुछ-अगर यदि आप निर्माण करते हैं तो एक वैरिएबल को प्रारंभ करते हैं या नहीं, तो कंपाइलर यह सुनिश्चित नहीं कर सकता है कि ये शर्तें सही साबित होंगी, जिसके परिणामस्वरूप स्थानीय चर का कोई प्रारंभिकरण नहीं होगा। "

भी स्पष्टीकरण के बाद, मैं अभी भी दो बातें,

  1. मुझे यकीन है कि नहीं कर रहा हूँ समझ में नहीं आया कि क्यों चर मॉडल संकलक भ्रमित करेगा, उसके बाद से दो कीमत 11 क्या मॉडल है की परवाह किए बिना है।
  2. जब आप अंत में अन्य डालते हैं तो यह जादूकीय रूप से स्थानीय चर को कैसे प्रारंभ करता है?
+0

'मूल्य' एक चर है और इस तरह का मान' चर 'हो सकता है। तो आपके कोड में, इस बात की कोई गारंटी नहीं है कि 'if' या' else if' ' –

+0

में दर्ज किया जाएगा, यदि अंतिम स्थिति 11.5 पर विफल हो सकती है और जैसा कि कोई और मॉडल शुरू नहीं किया जाएगा, –

+0

@Joop 11.5, निश्चित रूप से पहली शर्त पूरी हो गई है। हालांकि, यह NaN के लिए असफल हो जाएगा। –

उत्तर

11

model कोड को संकलन पास करने के लिए System.out.println(model); कथन से पहले प्रारंभ किया जाना चाहिए।

  1. संकलक की शर्तों का विश्लेषण नहीं करता है तो-और कुछ-अगर बयान निर्धारित करने के लिए उनमें से एक हमेशा पूरा किया जाएगा कि क्या, तो यह सुनिश्चित करें कि नहीं किया जा सकता है कि या तो अगर वरना-अगर ब्लॉक हमेशा निष्पादित होते हैं, और इसलिए यह सुनिश्चित नहीं हो सकता है कि modelprintln कथन से पहले शुरू किया जाएगा।

  2. आप एक अगर-किसी और निर्माण का उपयोग करें, या तो जब अगर नहीं तो ब्लॉक, मार डाला जाएगा ताकि बाद से उन दोनों को प्रारंभ model, यह println बयान से पहले प्रारंभ होने की गारंटी है।

संबंधित मुद्दे