Cómo usar .nextInt () y hasNextInt () en un ciclo while

Así que quiero que mi progtwig lea una entrada, que tiene algunos enteros en una línea, por ejemplo:

1 1 2

Luego debería leer cada entero por separado e imprimirlo en una nueva línea. El número de enteros que el progtwig tiene que leer no se da con anticipación, entonces lo que estoy tratando de hacer es usar un ciclo while, que finaliza cuando ya no hay más enteros para leer. Este es el código que escribí:

while (scan.hasNextInt()) { int x = scan.nextInt(); System.out.println(x); } 

pero no está funcionando correctamente, porque el bucle nunca termina, solo quiere que el usuario ingrese más enteros. ¿Que me estoy perdiendo aqui?

Su escáner básicamente espera hasta que aparezca un final de archivo. Y si lo usa en la consola, eso no sucede, por lo que continuará ejecutándose. Intenta leer los enteros de un archivo, notarás que tu progtwig terminará.

En caso de que no esté test.txt a leer un archivo, cree un archivo test.txt en su carpeta de proyectos y use Scanner scan = new Scanner(new File("test.txt")); con tu código

El hasNextInt llama bloques hasta que tenga suficiente información para tomar la decisión de “sí / no”.

Presione Ctrl + Z en Windows (o Ctrl + D en “Unix”) para cerrar el flujo de entrada estándar y activar un EOF . Alternativamente, escriba un no entero y presione enter .

La entrada de la consola normalmente está almacenada en la línea: debe presionarse enter (o EOF activado) y toda la línea se procesará a la vez .

Ejemplos, donde ^ Z significa Ctrl + Z (o Ctrl + D):

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

Ver también:

  • ¿Cómo obtengo el hasNextInt () de Java para dejar de esperar las entradas sin ingresar un carácter?
  • hasNext () – ¿cuándo se bloquea y por qué?
  • Java Scanner hasNext () no devuelve falso

Si desea detener su ciclo después de la línea, cree su Scanner esta manera:

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

El truco consiste en definir un delimitador que contenga espacios en blanco, la expresión vacía, pero no el siguiente carácter de línea. De esta forma, el Scanner ve \n seguido de un delimitador (nada) y la entrada se detiene después de presionar regresar.

Ejemplo: 1 2 3 \ n dará los siguientes tokens: Entero (1), Entero (2), Entero (3), No enteros (\ n) Por lo tanto, el hasNextInt devuelve falso.