2010-09-29 37 views
91

इस कोड को बस मुझे कुछ मिनट के लिए अपनी स्क्रीन पर टकटकी बनाया:"लूप:"। यह क्या है, यह संकलित क्यों करता है?

loop: 
for (;;) { 
    // ... 
} 

(line 137 here)

मैं इस से पहले कभी नहीं देखा है, और मुझे नहीं पता कि जावा एक "लूप" कीवर्ड था (नेटबीन्स इसे किसी कीवर्ड की तरह रंग भी नहीं देते हैं), और यह जेडीके 6 के साथ ठीक संकलित करता है।

क्या कोई मुझे यह समझा सकता है?

+7

* इस कोड ने मुझे कुछ मिनटों के लिए अपनी स्क्रीन पर देखा है * - हाहाहहाहाहा ... वहां गया, :) :) – luigi7up

उत्तर

167

यह keyword नहीं है यह label है।

उपयोग:

label1: 
    for (; ;) { 
     label2: 
     for (; ;) { 
      if (condition1) { 
       // break outer loop 
       break label1; 
      } 
      if (condition2) { 
       // break inner loop 
       break label2; 
      } 
      if (condition3) { 
       // break inner loop 
       break; 
      } 
     } 
    } 

Documentation

+1

@ कोरोनाटस: अगर आपको मदद मिली तो आपको उसका जवाब स्वीकार करना चाहिए। ;) –

+17

उल्लेखनीय मूल्य, क्योंकि ओपी गेटो/लेबल अवधारणा से परिचित नहीं हो सकता है, यह आमतौर पर बहुत ही विशेष परिस्थितियों को छोड़कर एक बुरे अभ्यास के रूप में माना जाता है (उदाहरण के लिए, एकाधिक नेस्टेड लूप को शॉर्टकट करने के लिए)। – haylem

+0

@ हेलम हाँ सच –

4

यह कोई कीवर्ड नहीं है, इसका label है।

यह आपको लेबल किए गए ब्रेक और जारी रखने के लिए लेबल करने की अनुमति देता है।

4

इसका एक को तोड़ने बिंदु लेबल, आपको सिर्फ़ अंतरतम एक आप में होना होता है की तुलना में, एक निर्दिष्ट लूप से बाहर तोड़ने के लिए अनुमति देने के लिए।

इसके line 148

1

यह एक लेबल है पर इस्तेमाल किया और जावा में लेबल break और continue लूपों पर अतिरिक्त नियंत्रण के लिए मुख्य शब्द के साथ उपयोग किया जा सकता है। यहां इसे एक बेहतर तरीके से समझाया गया है: http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ305_024.htm

69

जैसा कि अन्य पोस्टर ने कहा है, यह एक लेबल है, एक महत्वपूर्ण शब्द नहीं है। लेबल का उपयोग करने से आपको

outer: for(;;) { 
    inner: for(;;) { 
    break outer; 
    } 
} 

यह बाहरी लूप को तोड़ने की अनुमति देता है।

संपादित करें: के साथ link to documentation

+0

यदि आप एक ही लिंक org.life.java किया था तो मैं ऊपर उठ जाऊंगा। व्यावहारिक उपयोग के लिए – DJClayworth

2

यह एक लेबल है, हालांकि निम्नलिखित उदाहरण देखें:

int a = 0; 
int b = 0 
while (a<10){ 
    firstLoop: 
    a++; 
    while(true){ 
     b++ 
     if(b>10){ 
      break firstLoop; 
     } 
    } 
} 

b>10 निष्पादन प्रवाह बाहरी पाश

16

एक कीवर्ड नहीं है यही कारण है कि करने के लिए हो जाता है, यह है एक लेबल। यह नेस्ट छोरों अंदर break और continue खोजशब्दों के साथ इस्तेमाल किया जा करने के लिए होती है:

outer: 
for(;;){ 
    inner: 
    for(;;){ 
     if(){ 
      break inner; // ends inner loop 
     } else { 
      break outer; // ends outer loop 
     } 
    } 
} 
+1

भी +1! – f1sh

+0

'आंतरिक' लेबल बेकार है, 'ब्रेक;' पर्याप्त – gertas

+12

है यदि लूप को तोड़ने के दो तरीके हैं, तो मैं स्पष्टता के लिए 'आंतरिक' लेबल की सराहना करता हूं। –

2

आप लगभग कुछ भी लिख सकता है के रूप में यह एक लेबल है ... आप एक उदाहरण here

1

है यह एक नहीं है कीवर्ड, लेकिन लेबल।तो अंदर पाश आप break loop; लिखने के लिए, आपको लगता है कि पाश बाहर निकालता है

29

सवाल का जवाब दे रहा है, लेकिन एक पक्ष नोट के रूप में:

मैं साक्षात्कार प्रश्न एक ला "क्यों इस जावा कोड मान्य है" के बारे में सुना है (छीन

url: http://www.myserver.com/myfile.mp3 
downLoad(url); 

कि आप सभी जानते हैं कि इस कोड (भयंकर से अलग) है: सरल उदाहरण है, यहाँ meaner एक, tHX टिम Büthe) है?

समाधान: दो लेबल url और http, एक टिप्पणी www.myserver.com/myfile.mp3 और एक पैरामीटर लेबल के रूप में एक ही नाम (url) है के साथ एक विधि कॉल। हाँ, यह संकलित करता है (यदि आप विधि कॉल और स्थानीय चर को कहीं और परिभाषित करते हैं)।

+0

एफवाईआई आपको लूप की आवश्यकता नहीं है, ए; अगली पंक्ति में पर्याप्त –

+0

मुझे याद दिलाने के लिए धन्यवाद, मुझे लगता है कि प्रश्न में कोई लूप नहीं था। मैं अपना जवाब संपादित करूंगा (मुझे इस सवाल से कभी नहीं पूछा गया था लेकिन साक्षात्कारकर्ता मेरा पूर्व सहयोगी था) –

3

यह वास्तव में org.life.java के उत्तर पर सीनेज़र की टिप्पणी का उत्तर है, लेकिन मैं कुछ कोड डालना चाहता था इसलिए मैं टिप्पणी सुविधा का उपयोग नहीं कर सका।

हालांकि यह बहुत दुर्लभ है कि मुझे "ब्रेक लेबल" के लिए उपयोग मिलता है, यह मौलिक रूप से होता है। सबसे आम मामला है, जब मैं कुछ खोज करने के लिए, की तरह एक नेस्टेड पाश की आवश्यकता होती है एक संरचना में है कि खोज कर रहा हूँ:

search: 
for (State state : stateList) 
{ 
    for (City city : state.cityList) 
    { 
    if (city.zipcode.equals(wantZip)) 
    { 
     doSomethingTo(city); 
     break search; 
    } 
    } 
} 
आमतौर पर ऐसे मामलों में

मैं एक हिट पर एक सबरूटीन में पूरी बात धक्का कि तो मैं पाए गए ऑब्जेक्ट को वापस कर सकते हैं, और यदि यह लूप के नीचे गिर जाता है तो मैं न मिलने को इंगित करने के लिए शून्य वापस कर सकता हूं, या शायद अपवाद फेंक सकता हूं। लेकिन यह कभी-कभी उपयोगी होता है।

सचमुच, मुझे लगता है कि जावा के आविष्कारकों ने इस सुविधा को शामिल किया क्योंकि इस और अपवाद प्रबंधन के बीच, उन्होंने गोटो के लिए पिछले दो वैध उपयोगों को समाप्त कर दिया।

बहुत देर परिशिष्ट:

मैं कोड का एक बड़ा गैग लाइन एक बार देखा था। प्रोग्रामर ने लिखा:

http://www.example.com/xyz.jsp 
for (Foo foo1 : foolist) 

उन्होंने वास्तव में "example.com" लेकिन हमारी कंपनी की वेबसाइट नहीं कहा।

यह इंप्रेशन देता है कि कोड में एक यूआरएल है। यह सफलतापूर्वक संकलित करता है, जैसे यह कुछ करता है। लेकिन ... यह क्या करता है?

असल में यह कुछ भी नहीं करता है। "http:" एक लेबल है जिसे वह कभी संदर्भ नहीं देता है। फिर "//" शेष रेखा को एक टिप्पणी बनाता है।

0

यह एक लेबल है। वांछित स्थान पर नियंत्रण प्रवाह को स्थानांतरित करने के लिए जावा में उपयोग किए जाने वाले सामान्य लेबल, जबकि सभी कीवर्ड जारी रखने जैसे, ब्रेक स्थान का एक निर्दिष्ट टुकड़ा होता है।

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