“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?

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 .


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 .


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).


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
        }
    }
}

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.


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.


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 .



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.



1

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


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.