¿Cómo salir del ciclo while en java con el método Scanner “hasNext” como condición?

Soy un principiante en la progtwigción de Java y me he encontrado con un problema extraño. Debajo está mi código, que solicita al usuario la entrada e imprime lo que el usuario ingresa una palabra a la vez.

El problema es que el progtwig nunca termina, y desde mi comprensión limitada, parece haberse quedado dentro del ciclo while. ¿Alguien podría ayudarme un poco? Gracias por adelantado.

import java.util.Scanner; public class Test{ public static void main(String args[]){ System.out.print("Enter your sentence: "); Scanner sc = new Scanner (System.in); while (sc.hasNext() == true ) { String s1 = sc.next(); System.out.println(s1); } System.out.println("The loop has been ended"); // This somehow never get printed. } } 

Sigue obteniendo una nueva cadena y continúa el ciclo si no está vacía. Simplemente inserte un control en el ciclo para una cadena de salida.

 while(sc.hasNext() && !s1.equals("exit")) { // operate } 

Si quiere declarar la cadena dentro del bucle y no hacer las operaciones en el cuerpo del bucle si la cadena es “exit”:

 while(sc.hasNext()) { String s1 = sc.next(); if(s1.equals("exit")) { break; } //operate } 

El Scanner continuará leyendo hasta que encuentre una condición de “fin de archivo”.

Cuando estés leyendo desde stdin , será cuando envíes un caracter EOF (normalmente ^d en Unix), o al final del archivo si usas < style redirection.

Cuando usas el escáner, como menciona Alnitak, solo obtienes ‘falso’ para hasNext () cuando tienes un carácter EOF, básicamente … No puedes enviar fácilmente caracteres EOF usando el teclado, por lo tanto, en situaciones como esta, es común tener un carácter o palabra especial que puede enviar para detener la ejecución, por ejemplo:

 String s1 = sc.next(); if (s1.equals("exit")) { break; } 

Break te sacará del circuito.

Tu condición es correcta (aunque deberías descartar el == true ). Lo que está sucediendo es que el escáner seguirá funcionando hasta que llegue al final de la entrada. Intenta Ctrl + D , o canaliza la entrada desde un archivo ( java myclass < input.txt ).

no funciona porque no ha progtwigdo un fail-safe en el código. Java ve que el escáner aún puede recostackr información mientras se recostackn datos y, de ser posible, mientras eso sea cierto, sigue haciéndolo. tener una prueba de escáner para ver si una palabra determinada, como EXIT, por ejemplo, está bien, pero también podría hacer que se repita una cierta cantidad de veces, como diez o más. pero el enfoque más eficiente es preguntar al usuario de su progtwig cuántas cadenas desea ingresar, y si bien el número de cadenas que ingresan es menor que el número que ingresan, el progtwig se ejecutará. una opción agregada podría ser si escriben EXIT, cuando ven que necesitan menos espacios de los que ingresaron y no desean llenar las siguientes celdas con nada más que espacios en blanco. y puede hacer que el progtwig pregunte si desean ingresar más información, en caso de que se den cuenta de que necesitan ingresar más datos en la computadora. el progtwig sería bastante simplista de hacer, también porque hay una plethera de formas en que podrías hacerlo. no dude en preguntarme de esta manera, me estoy quedando sin espacio. XD

Si no quiere usar un caracter EOF para esto, puede usar StringTokenizer:

 import java.util.*; public class Test{ public static void main(){ Scanner sc = new Scanner (System.in); System.out.print("Enter your sentence: "); String s=sc.nextLine(); StringTokenizer st=new StringTokenizer(s," ");//" " is the delimiter here. while (st.hasMoreTokens() ) { String s1 = st.nextToken(); System.out.println(s1); } System.out.println("The loop has been ended"); } } 

Simplemente puede usar uno de los indicadores de fin de archivo dependientes del sistema (d para Unix / Linux / Ubuntu, z para Windows) para hacer que la instrucción while sea falsa. Esto debería sacarte del lazo muy bien. 🙂

Modifique el ciclo while de la siguiente manera. Declare s1 como Cadena s1; una vez fuera del ciclo. Para finalizar el ciclo, simplemente use ctrl + z.

  while (sc.hasNext()) { s1 = sc.next(); System.out.println(s1); System.out.print("Enter your sentence: "); }