2014-11-06 61 views
4

我遇到这个问题很多。当我多次使用扫描仪时,它不会从用户那里获得输入。Java多次使用扫描器

Scanner scan = new Scanner(System.in); 

     System.out.println("1---"); 

     int try1 = scan.nextInt(); 

     System.out.println("2---"); 

     int try2 = scan.nextInt(); 

     System.out.println("3---"); 

     String try3 = scan.nextLine(); 

     System.out.println("4---"); 

     String try4 = scan.nextLine(); 

当运行该代码,导致它:

1 ---

2 ---

3 ---

4 ---

aa

正如您所看到的,它跳过了第3个输入。为什么发生这种情况?我通过使用新的扫描仪解决了这个问题,有时我有5-6个不同的扫描仪,看起来很复杂。 另一个问题是:有一个错误“资源泄漏:扫描从不关闭”。我很困惑。

+1

您键入3“资源泄漏扫描永远不会关闭” ,然后是2,然后是1,然后是。 'int'是321。仍在等待处理。然后第一个'nextLine'调用读取,直到下一个,但之前您已经输入了,所以它返回该行(不包含任何内容)。考虑如果您键入“123 456 abc def ” – immibis 2014-11-06 12:27:03

+0

会发生什么情况,警告“资源泄漏:扫描永远不会关闭”。您需要关闭扫描。 scanner.close(); – 2014-11-06 12:27:54

+0

[Java - Scanner - 跳过我最后一个nextLine()请求]的可能重复(http://stackoverflow.com/questions/24770531/java-scanner-skips-over-my-last-nextline-request) – 2014-11-06 12:39:48

回答

2

下次使用API​​比nextLine而当你做下一步,你预先输入,它会生成数字+ \ n和nextInt只会采取整数,并不会采取\ n反过来传递给下一个输入,即try3这就是为什么它被跳过。

 Scanner scan = new Scanner(System.in); 

    System.out.println("1---"); 

    int try1 = scan.nextInt(); 

    System.out.println("2---"); 

    int try2 = scan.nextInt(); 

    System.out.println("3---"); 

    String try3 = scan.next(); 

    System.out.println("4---"); 

    String try4 = scan.next(); 
6

的问题是,用scanner.nextInt()你只当你按下回车一个整数值,而不是整个行,你不消耗换行符(\n)追加到该行。

然后,当您使用scanner.nextLine()处理阅读时,将消耗换行符(\n)和上一行,并且不读取要读取的行。为了强制它读取它,您必须添加额外的input.nextLine()声明。

System.out.println("2---"); 
int try2 = scan.nextInt(); 
System.out.println("3---"); 
scan.nextLine(); //<-- fake statement, to move the cursor on the next line 
String try3 = scan.nextLine(); 

不相关的问题,你必须关闭Scanner,工作完成后,否则编译器警告抱怨:

scan.close(); 
0

那么,对于第一个问题使用

scan.next()

insted的使用

scan.nextLine的();

对于我建议使用try第二个问题,假设您需要关闭您的扫描为你的编译器是警告:

Scanner scanner= null; 
    try { 
    scanner= new Scanner(System.in); 

    } 
    finally { 
    if(scanner!=null) 
    scanner.close(); 
}