Usernamer ha scritto:Una cosa non capisco: in teoria hasNextLine() non dovrebbe restituire false se nel flusso d'ingresso non c'è un'altra linea?
e dato che è la condizione del ciclo e che prima di entrare nel ciclo non scrivo nulla nel flusso d'ingresso non dovrebbe essere fin da subito la condizione false e dunque non eseguire per nulla il ciclo?
No, perché, se non c'è nulla in input, questa funzione blocca l'esecuzione del programma e si mette in attesa:
Usernamer ha scritto:Un'altra domanda sempre riguardo i metodi has: testando il codice seguente vorrei che dopo aver digitato "d" e vado a capo mi riscrivesse la linea "comando ecc" come fa quando scrivo altre lettere
Be', ma non è quello che richiedi nel programma:
- Codice:
10 {try
11 {System.out.println("Comando? (Q. B, D, W, A)");
12 String s = console.next();
...
30 else if(s.equalsIgnoreCase("d"))
31 {if(console.hasNextDouble())
32 {double x = console.nextDouble();
33 String s1 = console.nextLine();
34 if(s1.equals("") /*&& bankAccount.deposit(x)*/)
35 System.out.println("Versamento effettuato: " + x);
36 else if(s1.equals("") /*&& !bankAccount.deposit(x)*/)
37 System.out.println("Versamento non corretto");
38 }
39 else
40 console.nextLine();
41 }
...
76 }
Il programma stampa il prompt (riga 11).
Poi inizia a leggere l'input (riga 12). Siccome non c'è ancora nulla, si mette in attesa (anche
scanner.next()
è infatti una funzione bloccante).
A questo punto tu immetti la lettera
d seguita da
INVIO, e il tuo input è allora
d\n
1.
La funzione
next()
legge allora la lettera
d e la "pone" nella variabile
s. L'input "contiene" adesso solo un newline
\n
.
Il programma prosegue con i vari controlli del valore della variabile
s, e trova una condizione vera alla riga 30.
Il programma esegue allora il controllo alla riga 31. Siccome il tuo input non contiene nessun token, la funzione
scanner.nextDouble()
resta in attesa di ulteriore input. Se immetti un double, allora il programma esegue il blocco relativo e stampa nuovamente il prompt. Supponiamo invece che tu immetta nuovamente
d o una qualsiasi altra lettera, che non sia possibilmente uno degli altri comandi. Allora il tuo input conterrà:
\nd\n
. La predetta funzione restituirà
false
e il programma salterà alla riga 40.
Viene eseguita perciò la funzione
scanner.nextLine()
, che leggerà tutti i caratteri fino al successivo newline .Viene perciò di fatto eliminato il primo newline e Il tuo input conterrà ora
d\n
.
A questo punto il programma torna alla riga 11 e stampa di nuovo il prompt. Questa volta la funzione
next()
non attende, ma legge subito la lettera immessa precedentemente e il programma "salta" alla riga 31, ponendosi in attesa, perché non sono disponibili ulteriori token. Il tuo input contiene infatti solo un newline. A questo punto, a meno che non immetti un double, il programma leggerà la successiva riga, e il tuo input conterrà quello che avrai appena immesso.
Viene nuovamente stampato il prompt. La funzione
next()
legge la lettera o il token immesso etc, etc...
Ti pare più chiaro ora perché non stampa subito il prompt dopo la prima lettera d?
P.S. A essere sinceri, il programma è piuttosto contorto, ma è normale se sei solo agli inizi della programmazione. Se è così, il mio consiglio è di stamparlo, se non ce l'hai già su carta, e di eseguirlo tu manualmente, inserendo a fianco di ogni istruzione che incontri il contenuto corrente dell'input. Sarà più facile individuare eventuali bug e capire se è quello che effettivamente vuoi ottenere dal programma.