Java多次使用扫描仪

时间:2014-11-06 12:22:33

标签: java java.util.scanner

我经常遇到这个问题。当我多次使用扫描仪时,它无法从用户那里获得输入。

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 ---

12

2 ---

321

3 ---

4 ---

AA

正如您所看到的,它跳过第3个输入。为什么会这样?我使用新的扫描仪解决了这个问题,有时我有5-6种不同的扫描仪,看起来很复杂。 另一个问题是:出现错误"资源泄漏:扫描永远不会关闭"。我真的很困惑。

3 个答案:

答案 0 :(得分:6)

问题在于,使用scanner.nextInt()只能读取一个整数值,而不是整行,并且您不会使用附加到该行的换行符(\n)当您按 Enter

然后,当您使用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();

答案 1 :(得分:2)

使用下一个API而不是nextLine,就像当你执行nextInt时按Enter键,它会生成数字+ \ 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();

答案 2 :(得分:0)

好吧,对于第一个使用问题

  

scan.next()

使用

  

scan.nextLine();

对于第二个问题,我建议使用try,假设您需要关闭扫描,因为编译器警告:“资源泄漏:扫描永远不会关闭”

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

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