2010-03-10 8 views
6

Questa mattina, come esercizio per il mio corso di Java in Uni, ho dovuto scrivere un piccolo programma per chiedere all'utente di inserire alcuni dettagli, quindi stamparli di nuovo. Da allora ho finito di scriverlo, ma mi sono imbattuto in uno strano problema lungo la strada.Perché la riga 17 di questo programma Java non viene eseguita?

Vedere il codice qui sotto:

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(); 
    } 
} 

Quando questo programma viene eseguito, linea 17 (vedi commenti) viene saltato; Account name: viene stampato, ma all'utente non viene data la possibilità di inserire le informazioni, come se quella riga di codice fosse stata commentata. Non vengono lanciati errori L'output è simile al seguente: ID

Account:
Nome account:
equilibrio account:

Tuttavia, se posso passare le linee 13 e 14, con 16 e 17, come come segue, il programma funziona correttamente e nessuna linea viene saltata.

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

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

Perché la linea 17 viene saltata nel primo caso, ma non il secondo?

Se è in qualche modo pertinente, sto usando JDK 6 Update 18 e TextPad 5.3.1.

risposta

5

Uno sguardo allo javadoc dovrebbe mostrarti il ​​perché.

Scanner.nextLine() salta alla fine della riga corrente e restituisce tutto ciò che ha saltato. Poiché l'utente ha già inserito alcuni dati, questa funzione restituirà ciò che rimane nel flusso di input. Quando passi l'ordine, non ha ancora alcun input, motivo per cui lo vedi chiedere un input.

La parte importante:

Questo metodo restituisce il resto della linea corrente, escludendo qualsiasi separatore riga alla fine.

+1

Grazie, questo lo risolve. Avrei dovuto fare riferimento alla documentazione, in primo luogo. – Auguste

+0

@Auguste vivi e impari! +1 per provare a fare i compiti e fare una domanda ragionevole! – Kiril

5

NextInt() consuma semplicemente il valore intero. Una volta che il metodo è sicuro che l'input immesso è un numero completo, esce senza consumare i caratteri prodotti premendo il tasto Invio. Quando chiami NextLine() vede i caratteri di ritorno nel buffer e restituisce immediatamente una stringa di lunghezza zero.

Per risolvere questo problema, si consiglia di utilizzare sempre NextLine(). Gli utenti della linea di comando sono molto abituati alla chiave di ritorno che è il tasto "inserisci valore". Analizzare i risultati di NextLine() come numero intero utilizzando Integer.valueOf(result).

1

Da this thread:

La ragione ti dà problemi è perché quando l'utente inserisce un numero intero poi colpisce entrare, hanno appena stati inseriti due cose: il numero intero e un "a capo", che è \n .
Il metodo che si sta chiamando, "nextInt", legge solo nel numero intero, che lascia la nuova riga nel flusso di input.
Ma chiamando nextLine() si legge in newlines, motivo per cui si doveva chiamare nextLine() prima che il codice funzionasse.
Si potrebbe anche chiamare next(), che avrebbe anche letto nella nuova riga.

0

Scanner.nextInt cattura la prima occorrenza intero e nient'altro, quindi non gestisce la nuova linea carattere, che Scanner.readLine vedrà come input. È possibile aggiungere uno Scanner.next() in mezzo al quale si consumerebbe il carattere della nuova riga, ma questa soluzione ha i suoi lati negativi.

La mia soluzione sarebbe quella di leggere tutti gli input dell'utente con Scanner.readLine e analizzare i risultati desiderati dalle stringhe.

Problemi correlati