Error del escáner con nextInt() [duplicado]

Resuelto spatara asked hace 12 años • 1 respuestas

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

spatara avatar Oct 11 '12 11:10 spatara
Aceptado

Debe utilizar los hasNextXXXX()métodos de la Scannerclase 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 Scannerapunta 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();
Hunter McMillen avatar Oct 11 '2012 04:10 Hunter McMillen