2013-03-07 2 views
3

토론 포럼을 앞뒤로 읽지 않고 하루 종일 고심하고 있습니다. 누구나 왜 함수 aMenu()의 두 번째 호출이 0을 반환하는지 알 수 있으며 대신 새로운 사용자 입력을 기다리지 않습니까? hasNextInt(), nextLine(), 아무 것도 작동하지 않는 등 여러 가지 시도를했습니다. 사용자가 무언가를 쓸 때까지 hasNextInt()를 차단하면 안됩니까? 이 문제를 어떻게 해결할 수 있습니까? 감사.스캐너 내부의 메서드가 응답을 기다리지 않습니다.

package FirstJavaPackage; 
import java.util.Scanner; 

public class testScanner 
{ 
    public static void main(String[] args) 
    { 
     int choice = aMenu(); 
     System.out.println("You typed: "+choice); 
     choice = aMenu(); 
     System.out.println("You typed: "+choice); 
    } 

    public static int aMenu() 
    { 
     int result = 0; 
     System.out.println("In aMenu... enter an int: "); 
     Scanner keyboard = new Scanner(System.in); 
     if (keyboard.hasNextInt()) 
      result = keyboard.nextInt(); 
     keyboard.close(); 
     return result; 
    } 
} 

출력은 다음과 같습니다 ... aMenu 2 int를 입력 : 당신은 입력 :

aMenu에서

이 ... int를 입력 당신은 입력 : 0

답변

1

당신은 aMenu()로 통화에서 동일한 Scanner 개체를 다시 사용할 필요가 :

public static void main(String[] args) 
{ 
    Scanner keyboard = new Scanner(System.in); 
    int choice = aMenu(keyboard); 
    System.out.println("You typed: "+choice); 
    choice = aMenu(keyboard); 
    System.out.println("You typed: "+choice); 
} 

public static int aMenu(Scanner keyboard) 
{ 
    int result = 0; 
    System.out.println("In aMenu... enter an int: "); 
    result = keyboard.nextInt(); 
    return result; 
} 

자세한 내용은 How to use multiple Scanner objects on System.in?

+0

모두 감사합니다, 지금은 잘 작동을하지만, 난 여전히 논리를 얻지 않는다 완전히. 좋아, aMenu() 함수의 끝 부분에 입력 스트림을 닫고 있지만 다음 호출시 스캐너 키보드 = 새 스캐너 (System.in)를 사용하여 다시 열지 않았습니까? 그게 어떻게 일어날 수 있는지, 그리고 내가 추천 한 링크를 이미 읽었지만 나는 여전히 뭔가를 놓친 것 같아. 나중에 스트림을 닫았다가 다시 열 때 왜 작동하지 않습니까? 다시 한 번 감사드립니다. 훌륭한 커뮤니티를 만들고 있습니다! –

+1

@xx : 한 가지로'keyboard.close()'를 호출하면'System.in'도 닫힙니다. 이 시점부터, 당신은 더 이상 스캐너를 만들지 여부에 관계없이'System.in'에서 아무 것도 읽을 수 없습니다. – NPE

+0

고마워, 이제 알았다. 따라서 스트림이 닫히면 프로그램의 나머지 부분은 닫히고 존재하지 않는 것을 스캔 할 수는 없습니다. –

0

처음 호출 후 실질적으로 System.in 입력 스트림을 닫습니다. Scanner.close() 문서에서

:

When a Scanner is closed, it will close its input source if the source 
implements the Closeable interface. 

aMenu의 끝에서 스캐너를 close하지 시도해보십시오 aMenu 방법 외부 스캐너를 초기화하고 방법을 사용합니다. scanner.close 전체 입력 소스를 닫습니다 때문에

0

, 당신은 당신의 aMenu 방법에 스캐너를 통과하고 같은 것을 수행해야합니다

import java.util.Scanner; 

public class TestScanner 
{ 
    public static void main(String[] args) 
    { 
     Scanner keyboard = new Scanner(System.in); 
     int choice = 0; 

     do 
     { 
     choice = aMenu(keyboard); 
     System.out.println("You typed: " + choice); 
     } while (choice > 0); 

     keyboard.close(); 
    } 

    public static int aMenu(Scanner keyboard) 
    { 
     int result = 0; 
     System.out.println("In aMenu... enter an int: "); 

     if (keyboard.hasNextInt()) 
      result = keyboard.nextInt(); 

     return result; 
    } 
} 
관련 문제