2012-05-30 15 views
81

मेरे पास जावा स्विच के बारे में एक पागल सवाल है।जावा स्विच के भीतर चर घोषित करना और प्रारंभ करना

int key = 2; 

switch (key) { 
    case 1: 
     int value = 1; 
     break; 
    case 2: 
     value = 2; 
     System.out.println(value); 
     break; 
    default: 
     break; 
} 

परिदृश्य 1 - जब key दो है इसे सफलतापूर्वक के रूप में 2.
परिदृश्य 2 मूल्य प्रिंट - जब मैं case 2: में value = 2 टिप्पणी करने के लिए जा रहा हूँ यह कह स्थानीय चर मूल्य नहीं हो सकता है squawks शुरू किया गया था।

सवाल:

परिदृश्य 1: निष्पादन प्रवाह case 1: करने के लिए जाना नहीं है (जब key = 2), तो यह कैसे int के रूप में मान चर के प्रकार पता है?

परिदृश्य 2: यदि कंपाइलर मान चर के प्रकार को int के रूप में जानता है, तो इसे case 1: में अभिव्यक्ति तक पहुंच होनी चाहिए। (घोषणा और प्रारंभिकरण)। तो यह क्यों sqawrk करता है जब मैं value = 2case 2: में टिप्पणी करने जा रहा हूं, स्थानीय चर मान को प्रारंभ नहीं किया जा सकता है।

+9

यह एक पागल सवाल नहीं है, यह एक बहुत अच्छा सवाल है। – biziclop

+0

[स्विच केस में वेरिएबल के दायरे] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/3894119/variables-scope-in-a-switch-case) –

+0

@ फिलिप कैरिएर वास्तव में, मुझे लगता है कि यह विपरीत में होना चाहिए - यहां जवाब बेहतर है (भले ही पोस्ट नया है) क्योंकि जेएलएस का सीधा संदर्भ है, और उस पोस्ट में अलग-अलग उत्तरों में शामिल मुद्दे को संक्षेप में सारांशित करता है। [यह भी देखें] (http://meta.stackoverflow.com/questions/251938/should-i-flag-a-question-as-duplicate-if-it-has-received-better-answers)। – Tunaki

उत्तर

96

स्विच स्टेटमेंट स्कॉइंग के मामले में अजीब हैं, मूल रूप से। section 6.3 of the JLS से:

एक ब्लॉक में एक स्थानीय चर घोषणा की गुंजाइश (§14.4) घोषणा प्रकट होता है, जिसमें, में सही करने के लिए अपने स्वयं के प्रारंभकर्ता के साथ शुरू और किसी भी आगे declarators सहित ब्लॉक के बाकी है स्थानीय परिवर्तनीय घोषणा बयान।

आपके मामले में, case 2case 1 रूप में एक ही ब्लॉक में है और यह बाद दिखाई देता है, भले ही case 1 पर अमल कभी नहीं होगा ... इसलिए स्थानीय चर तार्किक आप के बावजूद लेखन के लिए गुंजाइश है और उपलब्ध है घोषणा को कभी "निष्पादित" नहीं करें। (एक घोषणा वास्तव में "निष्पादन योग्य नहीं है" हालांकि प्रारंभिकरण है।)

तुम बाहर टिप्पणी तो value = 2; असाइनमेंट, संकलक अभी भी जानता है जो चर आप की बात कर रहे हैं, लेकिन आप किसी भी निष्पादन पथ जो इसे एक मूल्य प्रदान करती है, है, जिसके माध्यम से चले गए हैं नहीं होगा तुम क्यों के रूप में कोई त्रुटि मिलती है आप तब करेंगे जब आप किसी भी अन्य निश्चित रूप से निर्दिष्ट स्थानीय चर को पढ़ने की कोशिश नहीं करेंगे।

मैं आपको अन्य मामलों में घोषित स्थानीय चर का उपयोग करने के लिए की दृढ़ता से अनुशंसा करता हूं - जैसा कि आपने देखा है, यह अत्यधिक भ्रमित कोड की ओर जाता है। जब मैं स्विच बयान में स्थानीय चर (जो मैं शायद ही कभी करने की कोशिश - मामलों बहुत ही कम होना चाहिए, आदर्श) परिचय मैं आमतौर पर एक नया गुंजाइश परिचय करना पसंद करते हैं:

case 1: { 
    int value = 1; 
    ... 
    break; 
} 
case 2: { 
    int value = 2; 
    ... 
    break; 
} 

मेरा मानना ​​है कि यह स्पष्ट है।

+8

+1 "एक घोषणा वास्तव में निष्पादन योग्य नहीं है" हालांकि प्रारंभिकता है। " और सलाह भी स्कीट के लिए धन्यवाद। – namalfernandolk

18

http://www.coderanch.com/t/447381/java-programmer-SCJP/certification/variable-initialization-within-case-block से

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

+0

यह उत्तर क्यों उठाया जा रहा है? यह सवाल का जवाब नहीं देता है, पॉल या स्कीट के जवाब के विपरीत ... –

+6

ऐसा करता है। तो, मेरी तरफ से +1, एक पैसा भी। संकलन समय और रनटाइम में घोषणा और प्रारंभिकरण के अच्छे स्पष्टीकरण के लिए –

18

परिवर्तनीय घोषित किया गया है (एक int के रूप में), लेकिन शुरू नहीं हुआ (प्रारंभिक मान असाइन किया गया)। रेखा के बारे में सोचो:

int value = 1; 

के रूप में:

int value; 
value = 1; 

int value हिस्सा संकलन समय आप एक चर मूल्य है जो एक पूर्णांक है कहा जाता है कि कम से संकलक बताता है। value = 1 भाग इसे प्रारंभ करता है, लेकिन यह रन-टाइम पर होता है, और ऐसा नहीं होता है कि स्विच की उस शाखा में प्रवेश नहीं किया गया है।

+0

+1। – namalfernandolk

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