Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2016
    Messaggi
    2

    Scanner(System.in) - metodo next()

    Ciao a tutti....
    sono nuova nel forum, e ho da poco iniziato a studiare Java.

    Sto diventando letteralmente matta con i metodi next() e nextInt() della funzione scanner .
    Mi chiedevo se qualcuno potesse aiutarmi a capire.

    Ho ad esempio il seguente programma:
    import java.util.Scanner;
    public class FrazioneContinua{
    public static void main(String args[]){
    Scanner in=new Scanner(System.in);
    double divisione=0, divisore=1;
    while (in.hasNextInt()){
    double val=(double) in.nextInt();
    divisore=(val+divisione);
    divisione=1/divisore;
    }

    System.out.println("La Frazione continua calcolata con un ciclo �="+divisore);


    }
    }


    per logica... mi aspetterei che se da input inserisco "1 2 3 " e poi premo invio, venga eseguito il while.. e dopo aver letto "3" , esca dal while (hasNextInt dovrebbe essere false). e a questo punto dovrebbe stampre sul monitor "La frazione continua... " Corretto?

    Invece sulla linea di comando, dopo il 3, il programma si "blocca" attendendo un nuovo input. Rimane costantemente in attesa di un nuovo input.

    Lo stesso mi succede in maniera analoga quando ho stringhe e uso "hasNext"


    ho trovato una sorta di soluzione usando "useDelimiter" e definendo lo scanner cosi:
    Scanner in=new Scanner(System.in).useDelimiter("\\s");

    ma � corretto?

    Grazie,


  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da eliside Visualizza il messaggio
    il programma si "blocca" attendendo un nuovo input. Rimane costantemente in attesa di un nuovo input.
    Quando è che lo "standard input" termina? Se fosse rediretto da un file, terminerebbe quando si arriva a eof (end-of-file). Ma se è da console in input dall'utente? Di per sé mai!
    Ma è possibile dare un eof da console, su Windows se ben ricordo con Ctrl+z seguito da invio.

    Altrimenti sei tu che dovresti prevedere un token, un qualcosa di particolare che faccia terminare la tua logica del ciclo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2016
    Messaggi
    2
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Quando è che lo "standard input" termina? Se fosse rediretto da un file, terminerebbe quando si arriva a eof (end-of-file). Ma se è da console in input dall'utente? Di per sé mai!
    Ma è possibile dare un eof da console, su Windows se ben ricordo con Ctrl+z seguito da invio.

    Altrimenti sei tu che dovresti prevedere un token, un qualcosa di particolare che faccia terminare la tua logica del ciclo.
    Ciao,
    Grazie mille..

    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.


    (io di solito uso nextLine(), e se ho bisogno di un int faccio parseInt() (anche per essere in grado di gestire le eccezioni) . Ma questo era un programma proposto come esempio dal docente... e alla fine non capivo se questo é il modo in cui dovrebbe funzionare, o se forse fosse solo un problema di configurazione del mio pc)

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    Perchè dopo aver letto il 3 con nextInt() rimane, appunto, l'INVIO all'interno del buffer che non è ancora stato consumato.
    Serve un next() / nextLine() per consumare, appunto, l'INVIO.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    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.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.