2014-09-21 2 views
2

새 프로그래머가 있습니다. 이것은 아마도 기본적인 질문 일 텐데 그럼에도 불구하고 저를 곤두박질칩니다.스캐너 hasNextInt()가 새 입력을 요청하도록하려면 어떻게해야합니까?

내가하려고하는 것은 하나의 정수 입력을 제공하는 메서드를 작성하므로 정수가 아닌 입력을 사용하지 않고도 주 프로그램에서 해당 입력을 사용할 수 있습니다. 그러나 자체 메서드에서이를 수행하는 메서드를 작성하는 것조차 문제가있는 것처럼 보입니다.

public static int goodInput() { 
    Scanner input = new Scanner (System.in); //construct scanner 
    boolean test = input.hasNextInt(); //set a sentinel value 
    while (test == false) { //enter a loop until I actually get an integer 
     System.out.println("Integers only please"); //tell user to give me an integer 
     test = input.hasNextInt(); //get new input, see if it's an integer 
    } 
    int finalInput = input.nextInt(); //once i have an integer, set it to a variable 
    input.close(); //closing scanner 
    return finalInput; //return my integer so I don't have to mess around with hasNextInt over there 
} 

여러 수준에서 깨진 것 같습니다.하지만 그 이유는 확실하지 않습니다.

처음 입력을 요청할 때 0 또는 1과 같은 정수 값을 입력하면 루프가 완전히 건너 뜁니다. 그러나 대신 루프에 들어가서 "Integers only please"를 인쇄합니다. 더 나쁜 것은, 내가 거기에있는 동안 실제로 입력을 요구하지 않고 그 라인을 반복적으로 인쇄한다는 것입니다.

나는 후자의 문제가 아마도 토큰 문제로 인한 것임을 이해한다. 그러나 나는 그들을 어떻게 해결할 지 항상 확신하지 못한다. 닫히고 나서 스캐너를 다시 열면 Eclipse가 "복제 객체"에 버그를 일으키고 오래된 입력을 가비지에 할당합니다. 사용되지 않는 String 변수는 런타임에 "No Line was found"라고 알려주고 충분히 경험이 없습니다 새로운 의견을 얻는 다른 방법을 생각해보십시오.

한 번 해결 되었더라도 정수가있는 경우 루프를 입력하지 않도록하는 방법을 찾아야합니다. 나는 왜 정수 입력이 처음부터 루프에 들어가는 지 이해하지 못하기 때문에 이것이 어떻게 가능할 지 모르겠습니다.

도와주세요. 이것이 낡은 질문이라면 죄송합니다. 과거의 질문을 보았지만 그들 중 누구도 내가 가진 문제와 같은 문제가없는 것 같습니다.

+0

'input.nextInt();'는 새로운 입력을 요구할 것입니다. 'input.hasNextInt();'는 사용 가능한 다음 입력을 검사하고, 따라서 true 또는 false를 반환합니다. –

+0

@shekharsuman : 그렇다면 입력을 얻는 방법은 무엇입니까? 입력이 어떤 유형인지, 입력이 int인지, 반복이 아닌지 확인하십시오. 내 실제 루프에서 input.nextInt()를 사용했다면 비 - int 입력이 만들어져 코드가 깨져 버렸을 것이라고 나는 믿는다. –

답변

3

당신은 가까웠다이 나를 위해 잘 작동 :

Scanner input = new Scanner(System.in); //construct scanner 
while(!input.hasNextInt()) { 
    input.next(); // next input is not an int, so consume it and move on 
} 
int finalInput = input.nextInt(); 
input.close(); //closing scanner 
System.out.println("finalInput: " + finalInput); 

당신의 while 루프에서 input.next()를 호출하여 비 정수를 소비 다음 입력이 int 일 때까지 다시 시도하고 다시 시도하십시오.

+0

+1, 좋습니다! 이 접근 방법을 추가하려고했지만 다행히도 답을 찾지 못했습니다 ... –

+0

이것은 나에게 어떤 이유로 든 문제가됩니다! 내 부울을 수정하는 대신 input.next()를 사용하여 코드를 다시 작성했을 때 실행하지 않아도 루프가 실행되고 몇 가지 예외가 발생합니다. java.util.NoSuchElementException, java.util.Scanner.throwFor 및 java.util.스캐너. 다음. –

+0

이 코드를 사용하여 콘솔은 입력을 기다립니다. 정수가 아닌 값을 입력하고 Enter 키를 누르면 단순히 새 줄을 시작하고 더 많은 입력을 기다립니다. 정수 값을 입력하고 Enter 키를 누르면 정수 값이 출력되고 실행이 중지됩니다. 이 코드를 실행할 때 (더 큰 코드 프로젝트에 포함하지 않고) 무엇을 볼 수 있습니까? – Bobulous

0
//while (test == false) {       // Line #1 
while (!test) { /* Better notation */    // Line #2 
    System.out.println("Integers only please"); // Line #3 
    test = input.hasNextInt();     // Line #4 
}             // Line #5 

문제는 위의 라인 # 4, input.hasNextInt() 단지 테스트 정수가 입력되면, 새로운 정수를 요구하지 않습니다. 사용자가 다른 정수를 입력하는 경우 hasNextInt()false을 반환하고 Scanner은 여전히 ​​정수를 예상하므로 InputMismatchException이 던져 졌으므로 을 요청할 수 없습니다.

당신은 next() 대신 nextInt() 사용해야합니다

while (!input.hasNextInt()) { 
    input.next(); 
    // That will 'consume' the result, but doesn't use it. 
} 
int result = input.nextInt(); 
input.close(); 
return result; 
관련 문제