Java Using Scanner Multiple Times

断了今生、忘了曾经 提交于 2019-12-23 13:32:17

问题


I am having this problem a lot. When I use a Scanner a lot of times, it doesn't get input from user.

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();

When I run this code, result it :

1---

12

2---

321

3---

4---

aa

As you can see, it skipped at 3rd input. Why this is happening? I solve this problem by using new Scanners, sometimes I have 5-6 different Scanners and it looks so complicated. Another problem is : there is an error "Resource leak: scan is never closed". I am really confused.


回答1:


Use next API rather than nextLine as when you do nextInt you press enter and it generates number + \n and nextInt is only going to take an integer and won't take \n which in turn gets passed to next input i.e. try3 which is why it gets skipped.

        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:


The problem is that by using scanner.nextInt() you only read an integer value, but not the whole line and you don't consume the newline character (\n) that is appended to the line when you press Enter.

Then, when you process reading with scanner.nextLine() you consume the newline character (\n) and from the previous row and don't read the line you want to read. In order to force it to read it, you have to add an additional input.nextLine() statement.

 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();

Not related to the question, you have to close the Scanner, after finishing work, otherwise the compiler complains with a warning:

scan.close();



回答3:


Well, for the first question use

scan.next()

insted of using

scan.nextLine();

For the second question I'd recommend using try, assuming you need to close your scan as your compiler is warning: "Resource leak: scan is never closed"

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

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


来源:https://stackoverflow.com/questions/26779393/java-using-scanner-multiple-times

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!