이 코드는 몇 분 동안 내 화면을 응시하게 만들었습니다.
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
. 예, 이것은 컴파일됩니다 (다른 곳에서 메서드 호출과 지역 변수를 정의한 경우).
답변
그것은 키워드가 아니라 레이블입니다. 중첩 루프 내 에서 break
및 continue
키워드 와 함께 사용됩니다 .
outer:
for(;;){
inner:
for(;;){
if(){
break inner; // ends inner loop
} else {
break outer; // ends outer loop
}
}
}
답변
답변
이것은 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 :”는 그가 결코 참조하지 않는 레이블입니다. 그런 다음 “//”는 나머지 줄을 주석으로 만듭니다.