“ loop:” ในโค้ด Java นี่คืออะไรและทำไมจึงรวบรวม?


113

รหัสนี้ทำให้ฉันจ้องหน้าจอไม่กี่นาที:

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

( สาย 137 ที่นี่ )

ฉันไม่เคยเห็นสิ่งนี้มาก่อนและฉันไม่รู้ว่า Java มีคีย์เวิร์ด "วนซ้ำ" (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
ควรค่าแก่การกล่าวถึงเนื่องจาก OP อาจไม่คุ้นเคยกับแนวคิด goto / label ซึ่งโดยทั่วไปถือว่าเป็นแนวทางปฏิบัติที่ไม่ดียกเว้นในสถานการณ์ที่เฉพาะเจาะจงมาก (เช่นสำหรับการลัดลูปที่ซ้อนกันหลาย ๆ อัน)
haylem

10
@haylem จริง แต่ฉันจะไปไกลกว่านั้น: ลูปที่ซ้อนกันหลาย ๆ วงมักจะเป็นการปฏิบัติที่ไม่ดีเช่นกัน เมื่อใดก็ตามที่ฉันใช้ป้ายกำกับลูปในที่สุดฉันก็ปรับโครงสร้างโค้ดใหม่ดังนั้นฉันจึงไม่ต้องการมัน มีวิธีที่ดีกว่านั้นเสมอ
Sean Patrick Floyd

73

ตามที่ผู้โพสต์คนอื่นกล่าวไว้ว่าเป็นป้ายกำกับไม่ใช่คีย์เวิร์ด การใช้ป้ายกำกับช่วยให้คุณทำสิ่งต่างๆเช่น:

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

สิ่งนี้ช่วยให้สามารถทำลายวงนอกได้

เชื่อมโยงไปยังเอกสาร


31

คำถามได้รับคำตอบ แต่หมายเหตุด้านข้าง:

ฉันเคยได้ยินคำถามสัมภาษณ์ a la "เหตุใดรหัส Java จึงถูกต้อง" (ถอดตัวอย่างที่ง่ายกว่านี่คือคนที่มีความหมายขอบคุณ Tim Büthe):

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

คุณทุกคนรู้หรือไม่ว่ารหัสนี้คืออะไร (นอกเหนือจากที่น่ากลัว)?

วิธีแก้ไข: สองป้ายกำกับurlและhttpข้อคิดเห็นwww.myserver.com/myfile.mp3และการเรียกใช้เมธอดพร้อมพารามิเตอร์ที่มีชื่อ ( url) เหมือนกับป้ายกำกับ ใช่สิ่งนี้รวบรวม (ถ้าคุณกำหนดการเรียกใช้เมธอดและตัวแปรโลคัลที่อื่น)


FYI คุณไม่ต้องการลูป a; ในบรรทัดถัดไปก็เพียงพอแล้ว
Tim Büthe

ขอบคุณที่เตือนฉันฉันคิดว่าไม่มีปัญหาในคำถาม ฉันจะแก้ไขคำตอบของฉัน (ฉันไม่เคยถามคำถามนี้ แต่ผู้สัมภาษณ์เป็นอดีตเพื่อนร่วมงานของฉัน)
Sean Patrick Floyd

16

นั่นไม่ใช่คีย์เวิร์ด แต่เป็นป้ายกำกับ ใช้กับคำหลักbreakและcontinueในลูปที่ซ้อนกัน:

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

innerฉลากไม่มีประโยชน์ที่นี่break;ก็เพียงพอแล้ว
gertas

12
หากมีสองวิธีในการทำลายลูปขอขอบคุณinnerสำหรับความชัดเจน
Steve Jackson

1
@gertas: ฉันคิดว่าเขาแค่แสดงให้เห็นถึงประเด็น แต่สำหรับ Steve Jackson อาจเป็นความคิดที่ดีที่จะพูดเพื่อวัตถุประสงค์ในการจัดทำเอกสารด้วยตนเอง
เจ

5

ไม่ใช่คีย์เวิร์ด มันเป็นป้าย

มันช่วยให้คุณไปที่มีข้อความและติดป้ายbreakcontinue


4

นี่เป็นการตอบกลับความคิดเห็นของ seanizer เกี่ยวกับคำตอบของ org.life.java แต่ฉันต้องการใส่รหัสบางอย่างจึงไม่สามารถใช้คุณลักษณะความคิดเห็นได้

แม้ว่าจะหายากมากที่ฉันจะพบว่ามีการใช้ "ป้ายชื่อแตก" แต่ก็เกิดขึ้นได้ในบางครั้ง กรณีที่พบบ่อยที่สุดคือเมื่อฉันค้นหาสิ่งที่อยู่ในโครงสร้างที่ต้องใช้ลูปซ้อนเพื่อค้นหาเช่น:

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

โดยปกติแล้วในกรณีเช่นนี้ฉันจะผลักสิ่งทั้งหมดลงในรูทีนย่อยเพื่อที่ฉันจะสามารถส่งคืนวัตถุที่พบได้ในการโจมตีและถ้ามันหลุดออกจากด้านล่างของลูปฉันสามารถคืนค่าว่างเพื่อระบุว่าไม่พบหรืออาจจะทำให้เกิดข้อยกเว้น แต่บางครั้งก็มีประโยชน์

ตรงไปตรงมาฉันคิดว่าผู้ประดิษฐ์ Java รวมคุณสมบัตินี้ไว้ด้วยเพราะระหว่างสิ่งนี้และการจัดการข้อยกเว้นพวกเขาได้กำจัดการใช้งาน GOTO ที่ถูกต้องสองรายการสุดท้าย

ภาคผนวกที่ล่าช้ามาก:

ฉันเห็นโค้ดปิดปากที่ยอดเยี่ยมครั้งหนึ่ง โปรแกรมเมอร์เขียนว่า:

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

เขาไม่ได้พูดว่า "example.com" แต่เป็นเว็บไซต์ของ บริษัท ของเรา

ทำให้รู้สึกว่ามี URL อยู่ในโค้ด มันรวบรวมสำเร็จเหมือนมันทำอะไรบางอย่าง แต่ ... มันทำยังไง?

ในความเป็นจริงมันไม่ทำอะไรเลย "http:" คือป้ายกำกับที่เขาไม่เคยอ้างถึง จากนั้น "//" ทำให้ส่วนที่เหลือของบรรทัดเป็นความคิดเห็น


4

เป็นป้ายกำกับจุดพักเพื่อให้คุณสามารถแยกวงออกจากวงที่ระบุได้แทนที่จะเป็นเพียงป้ายด้านในสุดที่คุณอยู่

โดยจะใช้ในสาย 148



2

เป็นป้ายกำกับ แต่ดูตัวอย่างต่อไปนี้:

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

เมื่อขั้นตอนb>10การดำเนินการไปที่วงนอก



1

มันไม่ได้เป็นคำหลัก แต่ฉลาก หากอยู่ในforลูปที่คุณเขียนbreak loop;และคุณออกจากลูปนั้น


0

มันคือฉลาก โดยทั่วไปป้ายกำกับที่ใช้ใน Java เพื่อถ่ายโอนโฟลว์การควบคุมไปยังตำแหน่งที่ต้องการในขณะที่คีย์เวิร์ดทั้งหมดเช่นดำเนินการต่อและแบ่งมีตัวเลือกตำแหน่งที่ระบุ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.