2010-03-10 17 views
6

Como un ejercicio para mi curso de Java en Uni esta mañana, tuve que escribir un pequeño programa para pedirle al usuario que ingrese algunos detalles, y luego imprimirlos de nuevo. Desde entonces terminé de escribirlo, pero me encontré con un problema extraño en el camino.¿Por qué la línea 17 de este programa Java no se está ejecutando?

Ver el código de abajo:

import java.util.Scanner; 

public class Scanner_Exercise 
{ 
    public static void main (String[] args) 
    { 
     Scanner keyboardIn = new Scanner(System.in); 

     int accountId; 
     String accountName; 
     float accountBalance; 

     System.out.println("Account ID: "); //Line 13 
     accountId = keyboardIn.nextInt(); //Line 14 

     System.out.println("Account name: "); //Line 16 
     accountName = keyboardIn.nextLine(); //Line 17 

     System.out.println("Account balance: "); 
     accountBalance = keyboardIn.nextFloat(); 
    } 
} 

Cuando se ejecuta este programa, la línea 17 (referirse a los comentarios) se omite; Account name: se imprime, pero el usuario no tiene la oportunidad de ingresar la información, como si esa línea de código estuviera comentada. No se arrojan errores La salida es el siguiente: Identificación

cuenta:
Nombre de la cuenta:
equilibrio cuenta:

Sin embargo, si cambio las líneas 13 y 14 con 16 y 17, como ya sigue, el programa funciona bien, y no se saltan líneas.

System.out.println("Account name: "); //Line 16 
accountName = keyboardIn.nextLine(); //Line 17 

System.out.println("Account ID: "); //Line 13 
accountId = keyboardIn.nextInt(); //Line 14 

¿Por qué se omite la línea 17 en el primer caso, pero no en el segundo?

Si de alguna manera es relevante, estoy usando JDK 6 Update 18 y TextPad 5.3.1.

Respuesta

5

Una mirada al javadoc debería mostrarle por qué.

Scanner.nextLine() salta hasta el final de la línea actual y devuelve lo que saltó. Como el usuario ya ha ingresado algunos datos, esta función devolverá lo que queda en la secuencia de entrada. Cuando cambias el orden, todavía no tiene ninguna entrada, por lo que lo ves pidiendo entrada.

La parte importante:

Este método devuelve el resto de la línea actual, excluyendo cualquier separador de línea al final.

+1

Gracias, eso lo aclara. Debería haberme referido a la documentación en primer lugar. – Auguste

+0

@Auguste usted vive y aprende! +1 por tratar de hacer su tarea y hacer una pregunta razonable! – Kiril

5

NextInt() meramente consume el valor entero. Una vez que el método está seguro de que la entrada que se ingresa es un número completo, sale sin consumir los caracteres producidos por la tecla de retorno presionada. Cuando llama al NextLine() ve los caracteres de retorno en el búfer e inmediatamente devuelve una cadena de longitud cero.

Para tratar con esto le recomiendo que siempre use NextLine(). Los usuarios de la línea de comando están muy acostumbrados a que la tecla de retorno sea la tecla "ingresar valor". Analizar los resultados de NextLine() como un entero usando Integer.valueOf(result).

1

De this thread:

La razón por la que te da problemas es porque cuando el usuario introduce un número entero a continuación, golpea entrar, solo se han inscrito dos cosas: el número entero y un "salto de línea", que es \n .
El método al que llama, "nextInt", solo se lee en el entero, lo que deja la nueva línea en la secuencia de entrada.
Pero al llamar al nextLine() lee en líneas nuevas, por lo que debe llamar al nextLine() antes de que su código funcione.
También podría haber llamado next(), que también se habría leído en la nueva línea.

0

Scanner.nextInt atrapa la primera aparición número entero y nada más, por lo que no maneja el carácter de nueva línea, que Scanner.readLine verá como su entrada. Podría agregar un Scanner.next() entre el cual consumiría el nuevo carácter de línea, pero esta solución tiene sus propios inconvenientes.

Mi solución sería leer todas las entradas del usuario con Scanner.readLine y analizar los resultados deseados de las cadenas.

Cuestiones relacionadas