Quote Originariamente inviata da eliside Visualizza il messaggio
ma se da input digito 1 2 3 <invio> ,

quando valuta "hasNext()" o "hasNextInt()" dopo il token "3" non dovrebbe valutare hasNext() false, e uscire dal ciclo?

Non capisco perché dopo il "3" (per esempio) il metodo hasNext() restituisce true.
Se si inserisce 1 2 3 <invio> succede che:

Un primo hasNextInt() dà true e se invochi nextInt(), Scanner consuma il token "1" e restituisce un int 1.
Un secondo hasNextInt() dà true e se invochi nextInt(), Scanner consuma il token "2" e restituisce un int 2.
Un terzo hasNextInt() dà true e se invochi nextInt(), Scanner consuma il token "3" e restituisce un int 3.
Attenzione: un quarto hasNextInt() si blocca in attesa di altro input, NON ritorna subito.

La documentazione di Scanner è molto chiara:

public boolean hasNext()
Returns true if this scanner has another token in its input. This method may block while waiting for input to scan. The scanner does not advance past any input.

public String next()
Finds and returns the next complete token from this scanner. A complete token is preceded and followed by input that matches the delimiter pattern. This method may block while waiting for input to scan, even if a previous invocation of hasNext() returned true.

E quel "may block" se Scanner è connesso allo standard-input avviene davvero (!), perché se tu con il codice sei continuamente in attesa di input (es. in ciclo) e l'utente è chiaramente sempre in grado di inserire dell'input .... non si finisce teoricamente mai!

Questo ciclo:

codice:
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
    System.out.println(sc.next());
}

Di per sé non termina mai! O perlomeno, a parte "killare" di brutto la applicazione, interrompere quel thread da un altro thread o cose del genere l'alternativa per farlo terminare è dare un "eof" da console che come ho detto prima su Windows si fa con Ctrl+Z e invio.


Paragone curioso: se il televisore è acceso, come fa a sapere se un tasto premuto sul telecomando è l'ultimo o no? ... Non lo sa! Il televisore è sempre in attesa di input dal telecomando e non può certo sapere cosa fai tu e quando col telecomando. Ed è il tasto "power" sul telecomando che è un "token" particolare per dire: ok, spegniti perché non c'è più altro da fare.