जावा कोड में "लूप:"। यह क्या है, और यह क्यों संकलन करता है?


113

इस कोड ने मुझे कुछ ही मिनटों के लिए मेरी स्क्रीन पर घूरने का मौका दिया:

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

( यहां लाइन 137 )

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

स्पष्टीकरण क्या है?

जवाबों:


205

यह नहीं है 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;
            }
        }
    }

प्रलेखन


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

10
@ हाइलम सच है, लेकिन मैं और आगे जाऊंगा: कई नेस्टेड लूप आमतौर पर एक बुरा अभ्यास है। जब भी मैंने लूप लेबल्स का उपयोग किया, मैंने अंततः कोड को रिफैक्ट कर दिया, इसलिए मुझे उनकी आवश्यकता नहीं थी। हमेशा इससे बेहतर तरीका होता है।
शॉन पैट्रिक फ्लोयड

73

जैसा कि अन्य पोस्टरों ने कहा है, यह एक कीवर्ड नहीं बल्कि एक लेबल है। लेबल का उपयोग करने से आप चीजों को कर सकते हैं जैसे:

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

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

प्रलेखन के लिए लिंक


31

प्रश्न का उत्तर दिया गया है, लेकिन एक नोट के रूप में:

मैंने साक्षात्कार के सवालों को एक ला के बारे में सुना है "यह जावा कोड क्यों मान्य है?" (सरल उदाहरण छीन लिया, यहाँ एक मतलब है, thx टिम Büthe):

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

क्या आप सभी को पता होगा कि यह कोड क्या है (भयावह के अलावा)?

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


FYI करें आपको लूप की आवश्यकता नहीं है, ए; अगली पंक्ति में पर्याप्त है
टिम बुथ

मुझे याद दिलाने के लिए धन्यवाद, मुझे लगता है कि प्रश्न में कोई छोर नहीं थे। मैं अपने उत्तर को संपादित करूँगा (मुझे यह प्रश्न कभी नहीं पूछा गया था लेकिन साक्षात्कारकर्ता मेरा एक पूर्व सहयोगी था)
शॉन पैट्रिक फ्लॉयड

16

यह एक कीवर्ड नहीं है, यह एक लेबल है। यह नेस्टेड छोरों के अंदर breakऔर continueकीवर्ड के साथ उपयोग करने के लिए है:

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

innerलेबल यहाँ बेकार है, break;पर्याप्त है
gertas

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

1
@gertas: मुझे लगता है कि वह सिर्फ इस बिंदु का प्रदर्शन कर रहा है। लेकिन स्टीव जैक्सन के अनुसार, इसे स्व-प्रलेखन उद्देश्यों के लिए वैसे भी कहना एक अच्छा विचार हो सकता है।
Jay

5

यह एक कीवर्ड नहीं है; यह एक लेबल है

यह आपको एक लेबल breakऔर लेबल पर जाने की अनुमति देता है continue


4

यह वास्तव में 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" नहीं कहा, लेकिन हमारी कंपनी की वेब साइट।

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

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


4

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

यह 148 लाइन पर प्रयोग किया जाता है ।


2

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


2

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

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

जब b>10निष्पादन प्रवाह बाहरी लूप में जाता है।


1

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

यहाँ इसे अच्छे तरीके से समझाया गया है:

जावा में सोचना, तोड़ना और जारी रखना


1

यह एक कीवर्ड नहीं है, बल्कि एक लेबल है । यदि forलूप के अंदर आप लिखते हैं break loop;, और आप उस लूप से बाहर निकलते हैं।


0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.