“Loop:” dalam kode Java. Apa ini, dan mengapa dikompilasi?

113

Kode ini membuat saya menatap layar saya selama beberapa menit:

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

( baris 137 di sini )

Saya belum pernah melihat ini sebelumnya, dan saya tidak tahu Java memiliki kata kunci "loop" (NetBeans bahkan tidak mewarnainya seperti kata kunci), dan itu dapat dikompilasi dengan baik dengan JDK 6.

Apa penjelasannya?

Amy B
sumber

Jawaban:

205

Ini bukan a keyworditu a label.

Pemakaian:

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

Dokumentasi .

Jigar Joshi
sumber
19
Perlu disebutkan, karena OP mungkin tidak terbiasa dengan konsep goto / label, yang secara umum dianggap sebagai praktik yang buruk, kecuali dalam situasi yang sangat khusus (misalnya, untuk memotong beberapa loop bersarang).
haylem
10
@ haylem benar, tetapi saya akan melangkah lebih jauh: beberapa loop bersarang biasanya juga merupakan praktik yang buruk. Setiap kali saya menggunakan label loop, saya akhirnya merefaktor kode jadi saya tidak membutuhkannya. Selalu ada cara yang lebih baik dari itu.
Sean Patrick Floyd
73

Seperti yang dikatakan poster lain, ini adalah label, bukan kata kunci. Menggunakan label memungkinkan Anda melakukan hal-hal seperti:

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

Ini memungkinkan putusnya loop luar.

Tautan ke dokumentasi .

Rob Di Marco
sumber
31

Pertanyaannya sudah terjawab, tapi sebagai catatan tambahan:

Saya pernah mendengar pertanyaan wawancara a la "Mengapa kode Java ini valid?" (menghapus contoh yang lebih sederhana; inilah yang lebih kejam, terima kasih Tim Büthe):

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

Apakah Anda semua tahu apa kode ini (selain mengerikan)?

Solusi: dua label, urldan http, komentar www.myserver.com/myfile.mp3dan pemanggilan metode dengan parameter yang memiliki nama yang sama ( url) sebagai label. Ya, ini mengkompilasi (jika Anda mendefinisikan panggilan metode dan variabel lokal di tempat lain).

Sean Patrick Floyd
sumber
FYI Anda tidak membutuhkan loop, a; di baris berikutnya sudah cukup
Tim Büthe
Terima kasih telah mengingatkan saya, saya pikir tidak ada loop dalam pertanyaan. Saya akan mengedit jawaban saya (saya tidak pernah ditanyai pertanyaan ini tetapi pewawancara adalah mantan kolega saya)
Sean Patrick Floyd
16

Itu bukan kata kunci, itu label. Ini dimaksudkan untuk digunakan dengan kata kunci breakdan continuedi dalam loop bersarang:

outer:
for(;;){
    inner:
    for(;;){
        if(){
            break inner; // ends inner loop
        } else {
            break outer; // ends outer loop
        }
    }
}
Michael Borgwardt
sumber
innerlabel tidak berguna di sini, break;sudah cukup
gertas
12
Jika ada dua cara untuk memutus lingkaran, saya menghargai innerlabel untuk kejelasan.
Steve Jackson
1
@gertas: Saya pikir dia hanya menunjukkan intinya. Tapi menurut Steve Jackson, mungkin ide yang bagus untuk mengatakannya untuk tujuan dokumentasi mandiri.
Jay
5

Ini bukan kata kunci; itu a label .

Ini memungkinkan Anda untuk pergi berlabel breakdan diberi label continue.

codaddict
sumber
4

Ini benar-benar merupakan balasan untuk komentar seanizer pada jawaban org.life.java, tetapi saya ingin memasukkan beberapa kode sehingga saya tidak dapat menggunakan fitur komentar.

Meskipun sangat jarang saya menemukan penggunaan untuk "label istirahat", itu terjadi sesekali. Kasus paling umum adalah ketika saya mencari sesuatu yang ada dalam struktur yang membutuhkan loop bersarang untuk mencari, seperti:

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

Biasanya dalam kasus seperti itu saya mendorong semuanya ke dalam subrutin sehingga pada pukulan saya dapat mengembalikan objek yang ditemukan, dan jika jatuh ke bagian bawah loop saya dapat mengembalikan null untuk menunjukkan tidak ditemukan, atau mungkin melempar pengecualian. Tapi ini terkadang berguna.

Terus terang, menurut saya penemu Java menyertakan fitur ini karena antara penanganan ini dan pengecualian, mereka menghilangkan dua penggunaan sah terakhir untuk GOTO.

Adendum yang sangat terlambat:

Saya pernah melihat baris kode lelucon yang bagus. Programmer menulis:

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

Sebenarnya dia tidak mengatakan "example.com", tetapi situs web perusahaan kami.

Ini memberi kesan bahwa ada URL di kode. Itu berhasil dikompilasi, seperti melakukan sesuatu. Tapi ... apa fungsinya?

Pada kenyataannya itu tidak melakukan apa-apa. "http:" adalah label yang tidak pernah dia referensikan. Kemudian "//" membuat sisa baris menjadi komentar.

Jay
sumber
4

Ini adalah label break point, untuk memungkinkan Anda keluar dari loop tertentu, bukan hanya loop terdalam tempat Anda berada.

Ini digunakan di baris 148 .

PaulJWilliams
sumber
2

Anda bisa menulis hampir semua hal, karena ini adalah label ... Anda punya contoh di sini

SoulWanderer
sumber
2

Itu adalah label, meskipun lihat contoh berikut:

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

Saat b>10aliran eksekusi masuk ke loop luar.

Alberto Zaccagni
sumber
1

Ini adalah label, dan label di Java dapat digunakan dengan kata kunci breakdan continueuntuk kontrol tambahan atas loop.

Di sini dijelaskan dengan cara yang cukup baik:

Berpikir di Jawa, istirahat dan lanjutkan

vstoyanov.dll
sumber
1

Ini bukan kata kunci, tapi label . Jika di dalam forloop Anda menulis break loop;, dan Anda keluar dari loop itu.

greuze
sumber
0

Itu adalah label. Umumnya label digunakan di Java untuk mentransfer aliran kontrol di lokasi yang diinginkan sementara semua kata kunci, seperti lanjutkan dan putus, memiliki pilihan lokasi tertentu.

RTA
sumber