2012-05-07 76 views
9

Soy un principiante en la programació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.¿Cómo salir del ciclo while en java con el método de escáner "hasNext" como condición?

El problema es que el programa nunca termina, y desde mi entendimiento limitado, 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. 
    } 
} 
+7

(offtopic) Es habitual que acaba de escribir 'while (sc.hasNext())' en vez que 'while (sc.hasNext() == verdadero)'. 'hasNext()' ya te devuelve un valor booleano. –

Respuesta

14

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 desea declarar la cadena dentro del bucle y no hacer las operaciones en el cuerpo del bucle si la cadena es "salida":

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

Esto es bueno, pero solo si declaras la Cadena fuera del ciclo (que puede no ser muy deseable) y si deseas ejecutar el cuerpo del ciclo incluso cuando obtengas la "Salida" de Cadena, ya que solo estás verificando esta condición DESPUÉS ejecución del cuerpo, que casi siempre no es lo que quieres. – Renato

+0

Editado según el comentario. –

5

El Scanner continuarán leyendo hasta que encuentra un "fin de archivo" condición.

Como usted está leyendo de stdin, que va a ser ya sea cuando se envía un carácter EOF (generalmente ^d en Unix), o al final del archivo si se utiliza < redirección estilo.

0

su condición es correcta (aunque debe soltar el == true). Lo que está sucediendo es que el escáner seguirá funcionando hasta que llegue al final de la entrada. Pruebe Ctrl + D, o canalice la entrada desde un archivo (java myclass < input.txt).

3

Cuando usa el escáner, como menciona Alnitak, solo obtiene 'falso' para hasNext() cuando tiene un carácter EOF, básicamente ... No puede enviar y usar caracteres EOF con el teclado, por lo tanto, en situaciones como esto, es común tener un carácter especial o palabra que se puede enviar para detener la ejecución, por ejemplo:

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

rotura te sacará del bucle.

+0

"No se puede enviar fácilmente y el carácter EOF usando el teclado" - usualmente Ctrl + D en Linux/Unix/Mac o Ctrl + Z en Windows lo hace. – trutheality

+2

Gracias, pero el conocimiento específico del sistema operativo no se combina bien con Java por lo general ... de ahí el comentario. – Renato

1

no funciona porque no ha programado un fail-safe en el código. Java ve que el escáner aún puede recopilar información mientras se recopilan 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 programa cuántas cadenas desea ingresar, y si bien el número de cadenas que ingresan es menor que el número que ingresan, el programa 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 programa 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 programa sería bastante simplista de hacer, también porque hay una plethera de formas en que podría hacerlo. no dude en preguntarme de esta manera, me estoy quedando sin espacio. XD

-3

Modifique el bucle while como se indica a continuación. 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: "); 
    } 
0

Usted puede simplemente utilizar uno de los indicadores dependientes de fin de archivo del sistema (d para Unix/Linux/Ubuntu, z para ventanas) para hacer la declaración mientras falsa. Esto debería sacarte del lazo muy bien.:)

1

Si no desea utilizar un carácter EOF para esto, puede utilizar 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"); 
    } 
} 
Cuestiones relacionadas