[java] 자바 코드에서 “loop :”. 이것은 무엇이며 왜 컴파일됩니까?

이 코드는 몇 분 동안 내 화면을 응시하게 만들었습니다.

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

이것은 외부 루프를 끊을 수 있습니다.

문서 링크 .


답변

질문에 대한 답이 있지만 참고로 다음과 같습니다.

“이 Java 코드가 유효한 이유는 무엇입니까?”라는 인터뷰 질문에 대해 들었습니다. (더 간단한 예를 제거했습니다. 여기에 더 비열한 것, Tim Büthe가 있습니다) :

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

이 코드가 무엇인지 알고 계십니까?

솔루션 : 두 개의 레이블, url및 레이블 과 동일한 이름 ( ) 을 가진 매개 변수를 사용하여 http주석 www.myserver.com/myfile.mp3및 메소드 호출 url. 예, 이것은 컴파일됩니다 (다른 곳에서 메서드 호출과 지역 변수를 정의한 경우).


답변

그것은 키워드가 아니라 레이블입니다. 중첩 루프 내 에서 breakcontinue키워드 와 함께 사용됩니다 .

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


답변

키워드가 아닙니다. 그것은 레이블 입니다.

레이블이 지정 break되고 레이블 이 지정된으로 이동할 수 있습니다 continue.


답변

이것은 org.life.java의 답변에 대한 seanizer의 의견에 대한 답변이지만 주석 기능을 사용할 수 없도록 코드를 입력하고 싶었습니다.

“브레이크 레이블”에 대한 용도를 찾는 것은 매우 드물지만 가끔 발생합니다. 가장 일반적인 경우는 다음과 같이 검색을 위해 중첩 루프가 필요한 구조에있는 항목을 검색 할 때입니다.

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

일반적으로 그런 경우에는 모든 것을 서브 루틴으로 밀어 넣어 적중시 발견 된 객체를 반환하고 루프의 맨 아래로 떨어지면 null을 반환하여 찾을 수 없음을 나타내거나 예외를 throw 할 수 있습니다. 그러나 이것은 때때로 유용합니다.

솔직히, Java의 발명가들이이 기능을 포함했다고 생각합니다.이 기능과 예외 처리 사이에서 GOTO의 마지막 두 가지 합법적 인 사용을 제거했기 때문입니다.

매우 늦은 부록 :

한 번은 훌륭한 개그 코드 라인을 보았습니다. 프로그래머는 다음과 같이 썼습니다.

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

그는 실제로 “example.com”이라고 말한 것이 아니라 우리 회사의 웹 사이트입니다.

코드에 URL이 있다는 인상을줍니다. 무언가를하는 것처럼 성공적으로 컴파일됩니다. 하지만 … 무엇을합니까?

실제로는 아무것도하지 않습니다. “http :”는 그가 결코 참조하지 않는 레이블입니다. 그런 다음 “//”는 나머지 줄을 주석으로 만듭니다.


답변

중단 점 레이블로, 단순히 가장 안쪽에있는 루프가 아닌 지정된 루프에서 벗어날 수 있습니다.

148 행에 사용됩니다 .