Error del escáner con nextInt() [duplicado]
Estoy intentando usar Scanner para obtener un int del teclado, pero aparece el siguiente error:
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Scanner.java:907)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextInt(Scanner.java:2160)
at java.util.Scanner.nextInt(Scanner.java:2119)
at TableReader.mainMenu(TableReader.java:122)
at TableReader.main(TableReader.java:76)
Esto es lo que tengo. Es independiente del resto de mi programa, no entiendo por qué esto no funciona. Se declara en un método que se llama en un bucle while, si eso ayuda.
// scan for selection
Scanner s = new Scanner(System.in);
int choice = s.nextInt(); // error occurs at this line
s.close();
Continué con el depurador y reduje el error a:
Java Runtime Environment ha detectado un error fatal: SIGSEGV (0xb) en pc=0xb6bdc8a8, pid=5587, tid=1828186944
Versión de JRE: 7.0_07-b30 Java VM: OpenJDK Server VM (23.2-b09 modo mixto linux-x86) Marco problemático: V [libjvm.so+0x4258a8] java_lang_String::utf8_length(oopDesc*)+0x58
No se pudo escribir el volcado del núcleo. Los volcados de núcleo se han deshabilitado. Para habilitar el volcado de núcleo, intente "ulimit -c unlimited" antes de iniciar Java nuevamente
Debe utilizar los hasNextXXXX()
métodos de la Scanner
clase para asegurarse de que haya un número entero listo para ser leído.
El problema es que se le llama nextInt()
y lee el siguiente entero de la secuencia a la que Scanner
apunta el objeto, si no hay ningún número entero para leer (es decir, si la entrada está agotada, lo verá NoSuchElementException
).
Desde JavaDocs, el nextInt()
método generará estas excepciones bajo estas condiciones:
- InputMismatchException: si el siguiente token no coincide con la expresión regular Integer o está fuera de rango
- NoSuchElementException: si la entrada está agotada
- IllegalStateException: si este escáner está cerrado
Puedes solucionar esto fácilmente usando el hasNextInt()
método:
Scanner s = new Scanner(System.in);
int choice = 0;
if(s.hasNextInt())
{
choice = s.nextInt();
}
s.close();