La comparación con null funciona bien. Y tu código al comparar con null es correcto.
Como indica la documentación de java sobre readLine este método devuelve null cuando se llega al final del stream.
Es posible que esto no lo hayas observado porque al usar la entrada estandar nunca hayas llegado al final del stream. Pero se puede producir. Obsérva por ejemplo tu programa (solo le he quitado la escritura en fichero y añadido unos println para que se vea lo que hace) en ideone.
Ponle como entrada (en input) :
matarife
Linurillo
Y tenemos como salida :
matarife
class java.lang.String
Linurillo
class java.lang.String
He terminado
Como puedes ver tu programa termina. La comparación con null funciona correctamente. Se ha detectado bien el fin del stream.
No cambies esta línea correcta de tu programa:
while ((s = teclado.readLine())!=null ) {
Por esta línea incorrecta:
while (!(s = teclado.readLine()).equals("final")) {
Puesto que si lo hicieses estarías empeorando tu programa. Estarías introduciendo la posibilidad de exepciones NullPointerException. Como puedes ver aqui.
¿Que está mal entonces?
El error lo podemos observar cambiando la entrada del programa anterior por :
matarife
final
Linurillo
Y la salida es:
matarife
class java.lang.String
final
class java.lang.String
Linurillo
class java.lang.String
He terminado
El programa sigue terminando, sale del bucle. Pero no se para en final como quieres sino que sigue leyendo hasta agotar todo el stream.
Por una parte la comparación de la cadena que debiera ser con equals
y no con ==
, es decir, has de usar :
if (s.equals("final")){
Mas detalles sobre la comparación de cadenas en la pregunta que enlaza sstan: ¿Cómo comparar correctamente Strings en Java?
Y en segundo lugar la salida del bucle. Con asignar null
a s
no sirve. Porque luego ese valor va a ser sobreescrito por (s = teclado.readLine())
antes de que se compare con null
. Sencillamente haz un break
;
if (s.equals("final")){
System.out.println(s);
break;
}
Tal como lo he puesto esto provocará una pequeña alteración en el funcionamiento de tu programa. No se imprime el último System.out.println(s.getClass());
del bucle. Pero seguro que esto lo puedes solucionar tu mismo.