Cómo usar los métodos hasNext...() de Scanner en Java
En Java, la clase Scanner trae varios métodos hasNext... que permiten validar el siguiente token antes de leerlo. Esto evita errores cuando el usuario escribe un valor que no corresponde al tipo esperado.
Crear el Scanner
import java.util.Scanner;
Scanner sc = new Scanner(System.in);
Principales métodos hasNext...
hasNext(): devuelvetruesi hay algún token disponible.hasNextInt(): verifica si el siguiente token es unintválido.hasNextDouble(): verifica si el siguiente token es undoubleválido.hasNextFloat(): verifica si el siguiente token es unfloat.hasNextLong(): verifica si el siguiente token es unlong.hasNextLine(): devuelvetruesi hay otra línea completa disponible.hasNextBoolean(): verifica si el siguiente token estrueofalse.hasNext(Pattern pattern): comprueba si el siguiente token coincide con una expresión regular.
Ejemplos
Validar un entero con if
System.out.print("Escribe un número entero: ");
if (sc.hasNextInt()) {
int n = sc.nextInt();
System.out.println("Leíste: " + n);
} else {
System.out.println("Eso no es un entero.");
sc.next(); // consumir token inválido
}
Leer varios enteros con while
System.out.println("Escribe enteros (Ctrl+D/Ctrl+Z para terminar):");
while (sc.hasNextInt()) {
int n = sc.nextInt();
System.out.println("Leído: " + n);
}
System.out.println("Fin de enteros.");
Combinar distintos tipos
System.out.print("Edad: ");
if (sc.hasNextInt()) {
int edad = sc.nextInt();
sc.nextLine(); // limpiar el salto de línea pendiente
System.out.print("Nombre completo: ");
String nombre = sc.nextLine();
System.out.println(nombre + ", " + edad + " años");
} else {
System.out.println("Edad inválida.");
}
Usar expresiones regulares
System.out.print("Escribe solo letras: ");
if (sc.hasNext("[a-zA-Z]+")) {
String s = sc.next();
System.out.println("Bien: " + s);
} else {
System.out.println("No cumple la expresión.");
}
Buenas prácticas
- Validar siempre con
hasNext...()antes de leer connext...(). - Usar
sc.nextLine()para limpiar el buffer cuando se mezclan números y líneas. - Cerrar el scanner al finalizar con
sc.close();.