2010-04-09 3 views
6
boolean r = false ; int s = 0 ; 
while (r == false) ; 
{ 
    s = getInt() ; 
    if (!(s>=0 && s<=2)) System.out.println ("try again not a valid response") ; 
    else r = true ; 
} 

3 또는 123을 입력하고 루프가 종료되지 않아도 텍스트가 표시되지 않습니다. 여기서 뭐가 틀린거야?이 while 루프에 문제가 있습니까?

+0

또한 무한 루프가 아니므로 '무한 루프'태그는 의미가 없습니다. –

+3

사실 그것은 무한 루프입니다. 'while (r == false);'는 r을 false로 초기화 했으므로 아무것도하지 않는 무한 루프입니다. –

+7

한 줄에 여러 항목 넣기를 중지하십시오. 무엇보다도, 이것은 당신의 문제를 일으킨 것입니다. 글쓰기 습관이 생기면 이런 일이 훨씬 줄어 듭니다. 또한 이클립스에서 경고를 설정하십시오 - 그것은 당신에게 빈 성명을 지적해야합니다. 이 문제를 해결하지 않고 근본 원인을 수정하십시오. –

답변

32

조건 뒤에 세미콜론이 있습니다. 중괄호를 사용하여 while에 대한 블록을 지정할 때 세미콜론을 사용하지 마십시오.

+2

참으로. 그 문제가 – David

+5

Hehe ...'while (r == false)/* DO NOTHING * /; ' – Armstrongest

8

기타 버그를 지적하지만 코드는 결국 당신을 여행 할 다른 방법으로 무서운 : 쉽게의 경우에 실행하는 하나 이상의 문을 의도 할 수 있기 때문에 나쁜

if (!(s>=0 && s<=2)) System.out.println ("try again not a valid response") ; 
else r = true ; 

if 또는 else 절. 중괄호를 사용하여 한 줄에 조건문을 배치하지 않도록 :

if (!(s>=0 && s<=2)) 
{ 
    System.out.println ("try again not a valid response"); 
} 
else 
{ 
    r = true; 
} 

이 읽기 ​​쉽고 어려운 볼 버그를 소개 훨씬 덜 가능성이 높습니다.

+2

중괄호 사용에 대해서는 동의하지 않습니다. 단일 명령문이면 단일 명령문입니다. 작풍의 문제로, 나는 들쭉날쭉하게 만들 것입니다 그러나 단 하나 계산서를 위해 curlies를 사용하지 ... 그러나 이것은 종교적인 전투이다. – Armstrongest

+2

@Atomiton 절대적으로, 나는 항상 돌아올 것이고 어느 시점에서 그것을 바꿀 가능성이 있기 때문에 나는 항상 사용하는 것을 선호한다. 적어도 다른 라인에 넣으십시오 - 우리가 그것에 동의 할 수 있기를 바랍니다 : –

+0

하나의 문장에 중괄호를 사용하지 않고 자주 돌아와 더 많은 것을 추가합니다. 실수로 중괄호를 추가하는 것을 잊지 않았습니다. 내 제어 흐름을 엉망으로 만들었지. 파이썬을 잠시 쓰고 C로 돌아 오지 않는 한. –

3

동안 (R == false)를

이어야

동안 (! R) 다른 사람들이 세미콜론에 대해 말에도 불구하고

, 즉 내가 잘못 생각하는 것입니다 :)

+1

'while (r == false)'는보다 명확하고 읽기 쉽습니다. 나는 사람들이'while (false == r)'이어야한다고 주장 할 수 있다고 생각하지만, 나는 그것을 싫어한다. 어쨌든'r'은 부 울린 값이므로 어떤 식 으로든 상관 없으므로 '! r'로 변경해야하는 것은 아닙니다. 이것은 스타일의 문제 일뿐입니다. –

+0

'r'과'!'규칙을 일관되게 따르십시오.'r == false'와'r == true' 대신'r'을 사용하면'r = false'와'r = true' (java에서 컴파일 오류를 일으키지 않음) 오류를 피할 수 있습니다. 더 명확하고 읽기 쉽게하려면'r'을'continue' 나'found'와 같이 이름을 바꾸십시오. – ILMTitan

+1

continue는 키워드이므로 끔찍한 변수 이름이됩니다. 당신 말이 맞습니다. 그러나 r과 s 같은 것들은 끔찍한 변수 이름입니다. 자동 완성 기능이있는 최신 IDE를 사용하고 완료되었거나 발견 된 것처럼 현명한 가치가 있다고 부릅니다. – ajs410

3

+1 Daniel DiPaolo. 나는 이유를 명확히하기 위해 별도의 답변을 게시 할 것입니다. 이유는입니다.

Java의 루프는 두 가지 방법 중 하나로 작성 될 수 있습니다. 루프의 몸에 하나의 라인이 있다면, 당신은 짧은 손 방식을 쓸 수 있습니다 : 프로그램이 끝날 때까지이 콘솔의 "루프 동안"인쇄됩니다

while (true) 
    System.out.println("While loop"); 

. 위에서했던 것처럼 다른 옵션은 중괄호 사이에 루프 본문을 지정하는 것입니다 :

int i = 0; 
while (i < 10) { 
    System.out.println("i = " + i); 
    i++; 
} 

이 인쇄됩니다 "나는 = 0", "I = 1", ..., "I = 9" 각각은 별도의 줄에 있습니다.

게시 한 코드가 두 코드를 혼동합니다. 단시간 while 루프에서 Java 파서는 while 루프 조건과 세미콜론 사이의 명령문을 찾으려고합니다. 여기서는 성명을 찾지 못하기 때문에 while 루프가 실행되지만 아무것도 수행하지 않습니다. 시체가 없다. 또한 루프에는 본문이 없기 때문에 변수 r이 새 값을 가질 기회가 없습니다. 조건은 항상 true로 평가되고 루프는 종료되지 않습니다.

당신이 당신의 예에서 while 루프의 조건을 부정 즉,

boolean r = false ; int s = 0 ; 
while (r != false) ; 
{ 
    s = getInt() ; 
    if (!(s>=0 && s<=2)) System.out.println ("try again not a valid response") ; 
    else r = true ; 
} 

이 (내가 거기에 잘못된 세미콜론을 왼쪽 주)한다면, 당신은 당신의 목적 루프 본문 정확하게 실행할 것을 찾아 낼 것입니다 한 번 루프가 실행되지 않을 것입니다.

3

다른 의견 외에도 경우

if (s < 0 || s > 2) 

에 그것은이 방법으로 훨씬 더 이해할 변경해야합니다.

+0

+1 분명히 말해서, 부정은 간단한 것이어야하는 무언가를 읽는 자질구레 한 일로 만듭니다. –

1

관련없는 답변은 정말 Sun의 스타일 가이드 라인을 따르는 것이 좋습니다.

boolean r = false ; 
int s = 0 ; 
while (r == false) { 
    s = getInt() ; 
    if (!(s>=0 && s<=2)) { 
     System.out.println ("try again not a valid response") ; 
    } else { 
     r = true ; 
    } 
} 

당신은 r 변수를 제거 할 수 및이/다른 조건 경우 루프 그 자체에 결과를 평가합니다.

int s = 0; 

while((s = getInt()) < 0 || s > 2) { 
    System.out.println("Try again, not a valid response"); 
} 
관련 문제