2013-02-25 2 views
1

나는 자바 코딩 된 갑자기이 같은 일부 코드 작성 :Java가 루프에서 멀리 떨어진 레이블을 허용하는 이유는 무엇입니까?

int x = 10; 
boolean b = true; 

l1: b = x > 1; 

l2: while (b) { 

    // some code 
    break l2; 
} 

을하고 놀랍게도 코드를 컴파일하고 제대로 실행합니다. 내 l1 레이블로 아무 일도하지 않지만 왜이 문장으로 올바르게 컴파일됩니까?

내가 자바 goto이 존재하지만 (Java Language Keywords)를 사용하지 않고, 나는 그것을로 이동할 수 있다는 어쨌든이 있음을 알아?

+0

레이블은 많은 중첩 루프를 벗어나는 경우에 사용됩니다. 당신은 'l1'을 깰 수 없을 것입니다. –

+0

Iirc, 2 중첩 된 루프가있을 수 있으므로 외부로 나가기를 원할 수 있습니다. – vikingsteve

+0

왜 그것이 작동하지 않아야한다고 생각합니까? 구문이 정확하면 컴파일해야합니다. – andre

답변

3

모든 문을 표시 할 수 있지만, they are only useful in conjunction with break or continue : C 및 C++과는 달리

는 자바 프로그래밍 언어에는 GOTO 문이 없습니다; 식별자 문 레이블은 구분 문 (14.15 절) 또는 연속 (14.16 절) 문과 함께 사용되어 레이블 문 안의 어느 곳에 나 나타납니다. 즉

은 사용할 수있을 레이블은 휴식을 포함하거나 차례로 break 만, 어떤 블록, 루프 수 또는 수있는, 계속 진술에 적용 할 필요가있다.

+0

나는 당신이 바른 사람이다라고 생각한다! – thiagoh

+0

컴파일러가 도달 할 수없는 레이블에 대해 불평하지 않는 이유는 Java 디자이너가 현재 사용하지 않고 예약 된 "goto"문을 사용하여 향후 레이블을 더 유용하게 만들 수 있기를 원하기 때문입니다 . –

+1

두 종류의 휴식 시간은 매우 다릅니다. "break label"은 임의의 블록에서 깨질 수 있습니다. 예를 들어,'abc : {break abc; }' – irreputable

2

아니오, l1으로 건너 뛰고 실행을 계속할 방법이 없습니다. 말씀대로, goto은 사용되지 않은 키워드입니다. 레이블은 루프를 break/continue으로 레이블링하는 데 유용합니다.

"점프"하고 싶다면 재귀와 같은 다른 프로그래밍 기술을 통해이를 수행 할 수있는 방법이 있습니다.

즉, 당신이

public void myMethod() { 
    b = x > 1; 

    while (b) { 
     // some code 
     myMethod(); 
    } 
} 

것은 비록 수익 조건을 추가해야합니다 ... l1 대신 단지 l2을 깨는로 다시 이동하기를 원한다면.

0

많은 루프에서 벗어나고 싶다면 레이블이 붙은 continue 문을 사용할 수 있습니다. 코드에 대한 해결 방법은 다음과 같습니다.

int x = 10; 
boolean b = true; 

l1: 
    for(int i=1;i>0;i--) { b = x > 1; 

     l2: while (b) { 
      // some code 
      //break l2; 
      i++;continue l1; 
     } 
    } 
관련 문제