hasNext () – ¿cuándo se bloquea y por qué?

Estoy tratando de leer comandos a través de un objeto de Scanner . Para verificar la syntax de entrada utilizo sc.hasNext() (para el caso de comandos faltantes). Ya funcionó bien para muchos casos, pero ahora tengo el caso que se describe en JavaAPI como “PUEDE bloquear y esperar la entrada”.

¿Cuándo se hasNext() método hasNext() y cómo puedo controlarlo? Lo divertido es que funciona perfectamente con 3 cajas antes del bloque. Además, JavaAPI describe hasNext() como el método adecuado para verificar si hay otra entrada o no, de modo que el método next() no produce una Exception .

Aquí está el código que produje hasta ahora:

 if (sc.hasNext() && sc.next().equals("create")) { if (sc.hasNextInt()) { width = sc.nextInt(); if (width > 0) { if (sc.hasNextInt()) { heigth = sc.nextInt(); if (heigth > 0) { if (sc.hasNext()) { //At this point the hasNext Statement blocks for //no reason till an Input is made. charset = sc.next(); Image = new AsciiImage(width, heigth,charset); } else { ret = false; System.out.println("INPUT MISMATCH"); } } ...//and so on 

Gracias de antemano, no pude encontrar nada en este tema por mi cuenta. Editar: El escáner se define como System.in, pero eso no debería ser un problema, al menos hasta ahora.

Existe una diferencia entre las pruebas a través de Console o mediante TextFile. Si leo desde Console, el progtwig espera un Stream y esperará más entradas.

Cuando se prueba a través de Input from Textfile (aún con System.in para el escáner, usando el progtwig Java), el hasNext () devolverá false al final del archivo ya que no se puede hacer más Input.

Realmente no puedo encontrar la documentación (en https://docs.oracle.com/javase/9/docs/api/java/util/Scanner.html#hasNext– ) en este tema. Entonces, si alguien encuentra una respuesta adecuada y técnica correcta, sería muy agradecido.

No estoy seguro, pero la siguiente es mi propia experiencia:
cuando el objeto Scanner se alimenta con un archivo, ¡no se bloqueará!
Con el término “alimentado con un archivo” quiero decir que el escáner está construido de esta manera:
Scanner scanner = new Scanner("myFile.txt");

Pero si el escáner se construye utilizando el método getInputStream() de un objeto Socket , así:

 input = socket.getInputStream(); Scanner scanner = new Scanner(input); 

¡el escáner estará bloqueando!

Si no tiene nada más que hacer mientras espera la entrada del usuario, entonces está bien ser bloqueado en esa llamada hasta que llegue la siguiente entrada.

Si desea ejecutar otro código mientras espera la entrada, genere un nuevo hilo y llame desde allí a los métodos de escaneo de hasNext y de locking.