2013-04-12 2 views
6

이 코드는 사용자로부터 정수를 얻은 다음 프로그램을 끝내기로되어 있습니다. 사용자가 잘못된 번호를 입력하면 사용자에게 다시 묻습니다.Scanner.reset()이 작동하지 않습니다.

예외를 포착 한 후 Scanner.reset()을 사용하여 스캐너를 재설정하지만 작동하지 않습니다. 이전 예외를 다시 throw합니다.

Scanner in = new Scanner(System.in); 
while (true) { 
    try { 
     System.out.print("Enter an integer number: "); 
     long i = in.nextLong(); 
     System.out.print("Thanks, you entered: "); 
     System.out.println(i); 
     break; 
    } catch (InputMismatchException ex) { 
     System.out.println("Error in your input"); 
     in.reset(); // <----------------------------- [The reset is here] 
    } 
} 

나는 Scanner.reset()이 모든 것을 재설정하고 예외를 잊어 버릴 것이라고 생각했습니다. 나는 사용자에게 새로운 입력을 요구하기 전에 그것을 넣었다.

요점이 잘못되면 어떻게 될까요?

+2

이 같은 next... 방법을 호출하기 전에 has... 방법을 사용한다? 해당 메소드에 대한 API 문서를 읽으십시오. – Jesper

+0

'reset()'으로 무엇을하려고합니까? 사용자 입력을 다시 묻는 중입니까? 그건'reset()'이하는 것이 아닙니다. –

답변

11

reset 메서드의 목적을 잘못 이해했습니다. 스캐너와 관련된 "메타 데이터"(공백, 구분 기호 문자 등)를 다시 설정해야합니다. 입력 상태가 변경되지 않으므로 원하는 내용을 얻을 수 없습니다.

는 당신이 필요로하는 것은 Scanner에서 어떤 String 읽고 삭제 next()의 전화입니다 : OK입니다 예외적 인 상황을 잡으려고 예외에 의존

try { 
    System.out.print("Enter an integer number: "); 
    long i = in.nextLong(); 
    System.out.print("Thanks, you entered: "); 
    System.out.println(i); 
    break; 
} catch (InputMismatchException ex) { 
    System.out.println("Error in your input"); 
    in.next(); // Read and discard whatever string the user has entered 
} 

,하지만 같은 문제에 더 나은 접근 방식은 것 당신은`Scanner.reset()`않습니다에 대해 어떻게 생각하십니까

System.out.print("Enter an integer number: "); 
if (!in.hasNextLong()) { 
    in.next(); 
    continue; 
} 
long i = in.nextLong(); 
System.out.print("Thanks, you entered: "); 
System.out.println(i); 
break; 
3

Scanner.reset() javadoc 당 방법은 로캘, 기수 및 구분 기호 설정 만 "재설정"합니다. 이미 읽은 데이터에는 아무런 변화가 없습니다.

관련 문제