2010-09-29 38 views
91

Mã này chỉ làm cho tôi nhìn chằm chằm vào màn hình của tôi cho một vài phút:"vòng lặp:" trong mã Java. Cái gì thế này, tại sao nó lại biên dịch?

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

(line 137 here)

Tôi chưa bao giờ thấy điều này trước đây, và tôi không hề biết Java có một "vòng" từ khóa (Netbeans thậm chí không tô màu nó như một từ khóa), và nó biên dịch tốt với JDK 6.

Ai đó có thể giải thích điều này cho tôi không?

+7

* Mã này chỉ khiến tôi nhìn chằm chằm vào màn hình của tôi trong một vài phút * - hahahahahahha ... đã ở đó, làm điều đó :) – luigi7up

Trả lời

167

Đây không phải là keywordlabel.

Cách sử dụng:

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

Documentation.

+1

@Coronatus: Bạn nên chấp nhận câu trả lời của mình nếu nó giúp bạn. ;) –

+17

Đáng nói đến, vì OP có thể không quen thuộc với khái niệm goto/label, nó thường được coi là một thực hành tồi, ngoại trừ trong các tình huống rất cụ thể (ví dụ, để rút ngắn nhiều vòng lồng nhau). – haylem

+0

@haylem yeah true –

4

Từ khóa không phải là từ khóa, là label.

Tính năng này cho phép bạn thực hiện ngắt được gắn nhãn và được gắn nhãn tiếp tục.

4

của một nhãn điểm break, để cho phép bạn thoát ra khỏi một vòng lặp chỉ định, chứ không phải chỉ đơn giản là một trong thâm tâm bạn xảy ra được.

của nó được sử dụng trên line 148

69

Như các áp phích khác đã nói, đó là một nhãn, không phải là từ khóa. Sử dụng nhãn cho phép bạn làm những việc như

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

Điều này cho phép phá vỡ vòng lặp ngoài.

EDIT: Với link to documentation

+0

Tôi sẽ upvote nếu bạn bao gồm cùng một liên kết org.life.java đã làm. – DJClayworth

2

Đó là một nhãn, mặc dù nhìn vào ví dụ sau:

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

Khi b>10 dòng chảy thực hiện đi vào các vòng ngoài

16

Đó không phải là một từ khóa, đó là một nhãn. Nó có nghĩa là để được sử dụng với các từ khóa breakcontinue bên trong vòng lặp lồng nhau:

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

cũng +1 để sử dụng thực tế! – f1sh

+0

nhãn 'bên trong' là vô ích ở đây, 'ngắt;' là đủ – gertas

+12

Nếu có hai cách để phá vỡ vòng lặp, tôi đánh giá cao nhãn 'bên trong' cho rõ ràng. –

2

Bạn có thể viết hầu hết mọi thứ, vì nó là một nhãn ... Bạn có một ví dụ here

1

Nó không phải là một từ khóa, nhưng nhãn .Nếu bên trong vòng lặp for bạn viết break loop;, bạn thoát vòng lặp mà

29

Câu hỏi đặt ra là đã trả lời, nhưng như một mặt lưu ý:

Tôi đã nghe nói về những câu hỏi phỏng vấn a la "Tại sao là mã java này có hiệu lực" (tước ví dụ đơn giản hơn, đây là ví dụ đơn giản hơn, thx Tim Büthe):

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

Bạn có biết mã này là gì (ngoài khủng khiếp) không?

Giải pháp: hai nhãn, urlhttp, nhận xét www.myserver.com/myfile.mp3 và cuộc gọi phương thức có thông số có cùng tên (url) làm nhãn. Yup, biên dịch này (nếu bạn xác định cuộc gọi phương thức và biến cục bộ ở nơi khác).

+0

FYI bạn không cần vòng lặp, a; trong dòng tiếp theo là đủ –

+0

Cảm ơn bạn đã nhắc nhở tôi, tôi nghĩ rằng không có vòng lặp nào trong câu hỏi. Tôi sẽ chỉnh sửa câu trả lời của mình (Tôi chưa bao giờ hỏi câu hỏi này nhưng người phỏng vấn là một đồng nghiệp cũ của tôi) –

3

Đây thực sự là câu trả lời cho nhận xét của seanizer về câu trả lời của org.life.java, nhưng tôi muốn đưa vào một số mã để tôi không thể sử dụng tính năng nhận xét.

Mặc dù rất hiếm khi tôi tìm thấy cách sử dụng cho "nhãn ngắt", thỉnh thoảng điều này xảy ra. Trường hợp phổ biến nhất là khi tôi đang tìm kiếm cái gì đó là trong một cấu trúc đòi hỏi một vòng lặp lồng nhau để tìm kiếm, như:

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

Thông thường trong trường hợp này tôi đẩy toàn bộ điều vào một chương trình con để trên một hit tôi có thể trả về đối tượng tìm thấy, và nếu nó rơi ra dưới cùng của vòng lặp, tôi có thể trả về null để chỉ ra một không tìm thấy, hoặc có thể ném một ngoại lệ. Nhưng điều này đôi khi hữu ích.

Thành thật mà nói, tôi nghĩ rằng các nhà phát minh Java bao gồm tính năng này bởi vì giữa việc xử lý này và ngoại lệ, họ đã loại bỏ hai sử dụng hợp pháp cuối cùng cho GOTO.

Phụ lục rất muộn:

Tôi thấy một dòng mã gag tuyệt vời một lần. Lập trình viên đã viết:

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

Anh ấy không thực sự nói "example.com" nhưng trang web của công ty chúng tôi.

Nó mang lại ấn tượng rằng có một URL trong mã. Nó biên dịch thành công, giống như nó làm điều gì đó. Nhưng ... nó làm gì?

Thực tế không có gì. "http:" là nhãn mà anh không bao giờ tham chiếu. Sau đó, "//" làm cho phần còn lại của dòng nhận xét.

0

đó là nhãn. nhãn chung được sử dụng trong java để chuyển luồng điều khiển ở vị trí mong muốn trong khi tất cả các từ khóa như tiếp tục, ngắt có một chice xác định vị trí.

Các vấn đề liên quan