รหัสนี้ทำให้ฉันจ้องหน้าจอไม่กี่นาที:
loop:
for (;;) {
// ...
}
( สาย 137 ที่นี่ )
ฉันไม่เคยเห็นสิ่งนี้มาก่อนและฉันไม่รู้ว่า Java มีคีย์เวิร์ด "วนซ้ำ" (NetBeans ไม่ได้ลงสีเหมือนคีย์เวิร์ด) และคอมไพล์ได้ดีกับ JDK 6
มีคำอธิบายอย่างไร?
รหัสนี้ทำให้ฉันจ้องหน้าจอไม่กี่นาที:
loop:
for (;;) {
// ...
}
( สาย 137 ที่นี่ )
ฉันไม่เคยเห็นสิ่งนี้มาก่อนและฉันไม่รู้ว่า Java มีคีย์เวิร์ด "วนซ้ำ" (NetBeans ไม่ได้ลงสีเหมือนคีย์เวิร์ด) และคอมไพล์ได้ดีกับ JDK 6
มีคำอธิบายอย่างไร?
คำตอบ:
มันไม่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;
}
}
}
ตามที่ผู้โพสต์คนอื่นกล่าวไว้ว่าเป็นป้ายกำกับไม่ใช่คีย์เวิร์ด การใช้ป้ายกำกับช่วยให้คุณทำสิ่งต่างๆเช่น:
outer: for(;;) {
inner: for(;;) {
break outer;
}
}
สิ่งนี้ช่วยให้สามารถทำลายวงนอกได้
คำถามได้รับคำตอบ แต่หมายเหตุด้านข้าง:
ฉันเคยได้ยินคำถามสัมภาษณ์ a la "เหตุใดรหัส Java จึงถูกต้อง" (ถอดตัวอย่างที่ง่ายกว่านี่คือคนที่มีความหมายขอบคุณ Tim Büthe):
url: http://www.myserver.com/myfile.mp3
downLoad(url);
คุณทุกคนรู้หรือไม่ว่ารหัสนี้คืออะไร (นอกเหนือจากที่น่ากลัว)?
วิธีแก้ไข: สองป้ายกำกับurl
และhttp
ข้อคิดเห็นwww.myserver.com/myfile.mp3
และการเรียกใช้เมธอดพร้อมพารามิเตอร์ที่มีชื่อ ( url
) เหมือนกับป้ายกำกับ ใช่สิ่งนี้รวบรวม (ถ้าคุณกำหนดการเรียกใช้เมธอดและตัวแปรโลคัลที่อื่น)
นั่นไม่ใช่คีย์เวิร์ด แต่เป็นป้ายกำกับ ใช้กับคำหลักbreak
และcontinue
ในลูปที่ซ้อนกัน:
outer:
for(;;){
inner:
for(;;){
if(){
break inner; // ends inner loop
} else {
break outer; // ends outer loop
}
}
}
inner
ฉลากไม่มีประโยชน์ที่นี่break;
ก็เพียงพอแล้ว
inner
สำหรับความชัดเจน
นี่เป็นการตอบกลับความคิดเห็นของ 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:" คือป้ายกำกับที่เขาไม่เคยอ้างถึง จากนั้น "//" ทำให้ส่วนที่เหลือของบรรทัดเป็นความคิดเห็น
เป็นป้ายกำกับจุดพักเพื่อให้คุณสามารถแยกวงออกจากวงที่ระบุได้แทนที่จะเป็นเพียงป้ายด้านในสุดที่คุณอยู่
โดยจะใช้ในสาย 148
คุณสามารถเขียนได้เกือบทุกอย่างเนื่องจากเป็นป้ายกำกับ ... คุณมีตัวอย่างที่นี่
เป็นป้ายกำกับ แต่ดูตัวอย่างต่อไปนี้:
int a = 0;
int b = 0
while (a<10){
firstLoop:
a++;
while(true){
b++
if(b>10){
break firstLoop;
}
}
}
เมื่อขั้นตอนb>10
การดำเนินการไปที่วงนอก
เป็นเลเบลและเลเบลใน Java สามารถใช้กับคีย์เวิร์ดbreak
และcontinue
คีย์เพื่อควบคุมลูปเพิ่มเติมได้
นี่คือคำอธิบายในทางที่ดี:
มันไม่ได้เป็นคำหลัก แต่ฉลาก หากอยู่ในfor
ลูปที่คุณเขียนbreak loop;
และคุณออกจากลูปนั้น
มันคือฉลาก โดยทั่วไปป้ายกำกับที่ใช้ใน Java เพื่อถ่ายโอนโฟลว์การควบคุมไปยังตำแหน่งที่ต้องการในขณะที่คีย์เวิร์ดทั้งหมดเช่นดำเนินการต่อและแบ่งมีตัวเลือกตำแหน่งที่ระบุ