How to use .nextInt() and hasNextInt() in a while loop

后端 未结 3 2073
礼貌的吻别
礼貌的吻别 2020-11-29 12:51

So I want my program to read an input, which has some integers in one line, for example:

1 1 2

Then it should read every integer separately and print it in a

相关标签:
3条回答
  • 2020-11-29 13:07

    Your scanner basically waits until an end of file comes in. And if you use it in the console that does not happen, so it will continue to run. Try reading the integers from a file, you will notice your program will terminate.

    In case you are new to reading from a file, create a test.txt in your project folder and use Scanner scan = new Scanner(new File("test.txt")); with your code.

    0 讨论(0)
  • 2020-11-29 13:20

    If you like to stop your loop after the line, create your Scanner like this:

    public static void main(final String[] args) {
        Scanner scan = new Scanner(System.in).useDelimiter(" *");
        while (scan.hasNextInt() && scan.hasNext()) {
            int x = scan.nextInt();
            System.out.println(x);
        }
    
    }
    

    The trick is to define a delimiter that contains whitespace, the empty expression, but not the next line character. This way the Scanner sees the \n followed by a delimiter (nothing) and the input stops after pressing return.

    Example: 1 2 3\n will give the following tokens: Integer(1), Integer(2), Integer(3), Noninteger(\n) Thus the hasNextInt returns false.

    0 讨论(0)
  • 2020-11-29 13:23

    The hasNextInt call blocks until it has enough information to make the decision of "yes/no".

    Press Ctrl+Z on Windows (or Ctrl+D on "unix") to close the standard input stream and trigger an EOF. Alternatively, type in a non-integer and press enter.

    Console input is normally line-buffered: enter must be pressed (or EOF triggered) and the entire line will be processed at once.

    Examples, where ^Z means Ctrl+Z (or Ctrl+D):

    1 2 3<enter>4 5 6^Z   -- read in 6 integers and end because stream closed
                          -- (two lines are processed: after <enter>, after ^Z)
    1 2 3 foo 4<enter>    -- read in 3 integers and end because non-integer found
                          -- (one line is processed: after <enter>)
    

    See also:

    • How do I get Java's hasNextInt() to stop waiting for ints without inputting a character?
    • hasNext() - when does it block and why?
    • Java Scanner hasNext() doesn't return false
    0 讨论(0)
提交回复
热议问题