Java kodunda "döngü:". Bu nedir ve neden derleniyor?


113

Bu kod birkaç dakikalığına ekranıma bakmamı sağladı:

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

( burada satır 137 )

Bunu daha önce hiç görmedim ve Java'nın bir "döngü" anahtar kelimesi olduğunu bilmiyordum (NetBeans bunu bir anahtar kelime gibi renklendirmiyor bile) ve JDK 6 ile iyi bir şekilde derliyor.

Açıklaması nedir?

Yanıtlar:


205

Bu bir değil keywordbir label.

Kullanımı:

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

Belgeler .


19
OP'nin goto / label kavramına aşina olmayabileceğinden, çok özel durumlar dışında (örneğin, birden çok iç içe döngüyü kısaltmak için) genellikle kötü bir uygulama olarak görüldüğünden bahsetmeye değer.
haylem

10
@haylem doğru, ancak daha da ileri gideceğim: çoklu iç içe döngüler de genellikle kötü bir uygulamadır. Ne zaman döngü etiketleri kullansam, sonunda kodu yeniden düzenledim, böylece onlara ihtiyacım kalmadı. Her zaman bundan daha iyi bir yol vardır.
Sean Patrick Floyd

73

Diğer posterlerin de söylediği gibi, bu bir anahtar kelime değil, bir etikettir. Etiketleri kullanmak aşağıdakilere benzer şeyler yapmanızı sağlar:

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

Bu, dış döngünün kırılmasına izin verir.

Belgelere bağlantı .


31

Soru cevaplandı, ancak bir yan not olarak:

"Bu Java kodu neden geçerli?" İle röportaj sorularını duydum. (daha basit örnek çıkarıldı; işte daha acımasız olan, thx Tim Büthe):

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

Hepiniz bu kodun ne olduğunu biliyor musunuz (berbat dışında)?

Çözüm: iki etiket urlve etiketle aynı ada ( ) sahip bir parametreye sahip httpbir yorum www.myserver.com/myfile.mp3ve bir yöntem çağrısı url. Evet, bu derlenir (yöntem çağrısını ve yerel değişkeni başka bir yerde tanımlarsanız).


Bilginize, döngüye ihtiyacınız yok, a; bir sonraki satırda yeter
Tim Büthe

Bana hatırlattığın için teşekkürler, sanırım soruda herhangi bir döngü yoktu. Cevabımı düzenleyeceğim (bu soru bana hiç sorulmadı ama görüşmeci eski bir meslektaşımdı)
Sean Patrick Floyd

16

Bu bir anahtar kelime değil, bu bir etiket. İç içe geçmiş döngülerin içindeki breakve continueanahtar kelimeleriyle kullanılması amaçlanmıştır :

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

inneretiket burada işe yaramaz break;, yeter
gertas

12
Döngüyü kırmanın iki yolu varsa, inneraçıklık için etiketi takdir ediyorum .
Steve Jackson

1
@gertas: Bence sadece noktayı gösteriyor. Ancak Steve Jackson'a göre, yine de kendi kendini belgelendirme amacıyla söylemek iyi bir fikir olabilir.
Jay

5

Bu bir anahtar kelime değil; bu bir etiket .

Etiketlenmiş breakve etiketlenmiş olarak gitmenizi sağlar continue.


4

Bu gerçekten görevlinin org.life.java'nın cevabı hakkındaki yorumuna bir cevap, ancak yorum özelliğini kullanamamak için biraz kod eklemek istedim.

"Kırılma etiketi" için bir kullanım bulmam çok nadir olsa da, ara sıra oluyor. En yaygın durum, arama yapmak için iç içe döngü gerektiren bir yapıda olan bir şeyi aradığım zamandır, örneğin:

search:
for (State state : stateList)
{
  for (City city : state.cityList)
  {
    if (city.zipcode.equals(wantZip))
    {
      doSomethingTo(city);
      break search;
    }
  }
}

Genellikle bu gibi durumlarda, her şeyi bir alt yordamın içine iterim, böylece bir vuruşta bulunan nesneyi geri verebilirim ve döngünün altından düşerse, bulunamadığını belirtmek için null döndürebilir veya belki bir istisna atabilirim. Ancak bu bazen yararlıdır.

Açıkçası, Java'nın mucitlerinin bu özelliği eklediklerini düşünüyorum çünkü bu ve istisna işleme arasında GOTO'nun son iki meşru kullanımını ortadan kaldırdılar.

Çok geç ek:

Bir keresinde harika bir kod satırı gördüm. Programcı şunu yazdı:

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

Aslında "example.com" demedi ama şirketimizin web sitesi.

Kodda bir URL olduğu izlenimini verir. Başarılı bir şekilde derler, bir şeyler yaptığı gibi. Ama ... ne işe yarar?

Gerçekte hiçbir şey yapmaz. "http:" asla referans göstermediği bir etikettir. Sonra "//", satırın geri kalanını bir yorum yapar.


4

Bu, içinde bulunduğunuz en içteki döngüden ziyade, belirli bir döngüden çıkmanıza izin veren bir kırılma noktası etiketidir.

148. hatta kullanılıyor .



2

Bu bir etiket olsa da aşağıdaki örneğe bakın:

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

Tüm b>10yürütme akış dış döngü gider.



1

Bu bir anahtar kelime değil, bir etikettir . forDöngünün içinde yazarsan break loop;ve o döngüden çıkarsan.


0

Bu bir etikettir. Genel olarak, Java'da kontrol akışını istenen konuma aktarmak için kullanılan bir etiket, devam et ve kes gibi tüm anahtar sözcükler belirli bir konum seçeneğine sahiptir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.