Java - Bucle infinito leyendo buffer de entrada estándar

   
Vista:

Bucle infinito leyendo buffer de entrada estándar

Publicado por Marteens (8 intervenciones) el 18/09/2015 17:32:57
Hola.
En el método static main tengo el siguiente código:

1
2
3
4
5
6
7
8
9
10
String line;
BufferedReader in = new BufferedReader (new
	InputStreamReader(System.in));
 
line = in.readLine();
 
while ( line != "fin") {
	System.out.println(line);
	line = in.readLine();
}

o (entiendo que es lo mismo)

1
2
3
4
5
6
String line;
BufferedReader in = new BufferedReader (new
	InputStreamReader(System.in));
 
while ( (line = in.readLine()) != "fin")
	System.out.println(line);

Aunque teclee "fin" desde la consola, el programa no finaliza. Es como si ignorase el while.
Os agradecería si me explicaseis el motivo.
Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alberto

Bucle infinito leyendo buffer de entrada estándar

Publicado por Alberto (243 intervenciones) el 18/09/2015 19:15:40
Hola...

Ambos códigos están en lo correcto, sin embargo, el error esta en la condicional del while, te explico...

Java a diferencia de otros lenguajes de programación interpreta un String como un Wrapper (Tipo de variable con la capacidad de adquirir métodos, en resumen, un Objeto), por lo tanto, tratarlo como un tipo primitivo (Tipo de variable que carece de métodos) es caer en un error común.

Al entender que String viene siendo un Objeto, nosotros debemos tratarlo como tal, por lo tanto, hacer comparaciones con el tradicional == o != es totalmente erróneo. Para ello Java nos proporciona un método el cual nos permite comparar objetos entre sí... equals(), el cual viene equivaliendo a un == pero aplicado para objetos.

De esta manera, teniendo este conocimiento básico, tu código quedaría de la siguiente manera...

1
2
3
4
5
String line;
BufferedReader in = new BufferedReader (new InputStreamReader(System.in));
 
while (!(line = in.readLine()).equals("fin"))
	System.out.println(line);

Es importante mencionar que para poder implementar != entonces hacemos uso del tradicional signo de exclamación !.

Sin mas que comentar, cualquier duda y/o inconveniente, aquí estamos.

Suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Bucle infinito leyendo buffer de entrada estándar

Publicado por Tom (914 intervenciones) el 18/09/2015 19:18:57
Porque en java para comparar objetos según su contenido debes usar el método equals() (y todo lo que no es un tipo básico, es un objeto).

Si has visto alguna vez código que compara así los strings, y funciona, es por otra razón.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar