2012-10-11 21 views
5

Estoy tratando de utilizar el escáner para obtener un entero desde el teclado, pero consiguiendo el error siguiente:de error del escáner con nextInt()

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 está funcionando. Se declara en un método que se está llamando en un ciclo while, si eso ayuda.

// scan for selection 
    Scanner s = new Scanner(System.in); 
    int choice = s.nextInt();   // error occurs at this line 
    s.close(); 

Di un paso adelante con el depurador y estrechan el error a:

Un error fatal ha sido detectado por el entorno de ejecución de Java: SIGSEGV (0xb) en pc = 0xb6bdc8a8, pid = 5587, tid = 1828186944

JRE versión: 7.0_07-b30 Java VM: OpenJDK servidor VM (23.2-b09 modo mixto linux-x86) marco Problemática: V [libjvm.so + 0x4258a8] java_lang_String :: utf8_length (oopDesc *) + 0x58

Error al escribir el volcado del núcleo. Los volcados del núcleo han sido deshabilitados Para habilitar el volcado del núcleo, intente con "ulimit -c unlimited" antes de volver a iniciar Java

Respuesta

8

Debe utilizar los métodos hasNextXXXX() de la clase Scanner para asegurarse de que haya un entero listo para leer.

El problema es que se llaman nextInt() que lee el siguiente número entero de la corriente que los Scanner puntos objeto a, si no hay un número entero allí para leer (es decir, si la entrada se agota entonces se verá que NoSuchElementException)

de los JavaDocs, el método nextInt() lanzará estas excepciones en estas condiciones:

  • InputMismatchException - si el siguiente token no coincide con la expresión regular Entero , o está fuera de rango
  • NoSuchElementException - si la entrada se agota
  • IllegalStateException - si este escáner está cerrado

Puedes solucionar este problema fácilmente usando el hasNextInt() método:

Scanner s = new Scanner(System.in); 
int choice = 0; 

if(s.hasNextInt()) 
{ 
    choice = s.nextInt(); 
} 

s.close(); 
+0

Esto me envía en un bucle infinito, porque lo está dentro de los paréntesis nunca se llama – spatara

+0

@spatara Sí comprueba si cualquiera de los siguientes elementos a los que apunta el escáner puede convertirse con éxito en un entero, si puede entonces 'hasNextInt()' devolverá verdadero, de lo contrario lo hará falso retorno. –

+0

Estoy leyendo desde el teclado, no hay nextInt cuando el método se llama – spatara

Cuestiones relacionadas