2011-01-27 8 views
1
boolean z = false; 
do { 
    try { 
     a = sc.nextInt(); 
     z = true; 
    } 
    catch(Exception e) { 
    } 
} 
while(!z); 

시도해보십시오. 정수를 처음 시도하면 제대로 실행됩니다. 그러나 잘못된 유형의 텍스트를 입력하면 다음에 int를 입력해도 부울 값이 true로 지정되는 것을 건너 뛰더라도 무한 루프로 바뀝니다. 왜 이런거야?스캐너를 사용할 때 무한 루프가 발생합니까?

+7

이 코드는 거의 의미가 없습니다. 변수 포수는 선언되지 않았으며 루프 내에서 확실히 변경되지 않았습니다. 아마도 당신은 그것을 잘못 복사 했나요? 이와 같은 문제에 대해서는 가능한 한 자주 소형의 자체 컴파일 가능한 프로그램을 게시하는 것이 가장 좋습니다. –

+2

이 줄은 while (z == false)으로 설정되어 있습니까? ??? – CoolBeans

+0

나는 예스라고 생각하지만, 심지어 그것은 나쁜 형태이다. while (! z) while이 더 좋습니다. –

답변

8

문제는 라인 토큰 끝을 처리하지 않아 스캐너가 매달려 있기 때문입니다. 다음과 같이하고 싶습니다.

import java.util.Scanner; 

public class Foo2 { 
    public static void main(String[] args) { 
     Scanner sc = new Scanner(System.in); 
     int a = 0; 
     boolean catcher = false; 
     do { 
      try { 
       System.out.print("Enter a number: "); 
       a = sc.nextInt(); 
       catcher = true; 
      } catch (Exception e) { 
      } finally { 
       sc.nextLine(); 
      } 

     } 
     // !!while(catcher == false); 
     while (!catcher); 

     System.out.println("a is: " + a); 
    } 
} 

또한 (z == false)는 잘못된 형식입니다. while (! z)을 사용하면 훨씬 나아집니다. 이렇게하면 while (z = false) 오류를 방지하고이를 표현하는 더 깨끗한 방법입니다. 마르셀로에 대한

편집 :

마르셀, 귀하의 의견과 조언에 감사드립니다! if 블록의 조건부가 부울 값인 스팸을 변경하지 않는다고 말하고 있습니까? 그것을 변경 않을 경우 그들이 경우 (스팸 == 거짓)를 작성하도록하는 경우, 코더이 기대하지 않기 때문에

boolean spam = true; 

    if (spam = false) { 
    System.out.println("spam = false"); 
    } 

    System.out.printf("spam = %b%n", spam); 

, 다음이에서 미묘하고도 위험한 부작용이있을 수 있습니다. 다시 한 번, 나를 명확히 해 주셔서 감사합니다!

+0

감사합니다. 마침내 완벽하게 작동했습니다. 그것은 내가 생각했다! z와 z == false는 같은 것이다? –

+0

그들은 그렇지만, 대부분 느낌! z는 더 깨끗합니다. 그리고 if 조건이 실제로 boolean을 설정하는 경우, 다시는 위험한 if (z = false) 오류가 발생하지 않습니다. –

+1

할당은 어떤 값으로도 평가되지 않기 때문에 Java에서는 할당 오류가 발생하지 않습니다 (유효한 표현식이 아닙니다.) C, C++ 및 다른 언어의 문제입니다. – Marcelo

관련 문제