Visualizzazione dei risultati da 1 a 4 su 4

Discussione: nextLine() ignorato

  1. #1

    nextLine() ignorato

    Salve, probabilmente la stanchezza mi sta giocando qualche scherzo...
    Ho scritto un semplice codice per acquisire dati dall'utente mediante un'istanza input della classe Scanner, e quindi passare tutto a un costruttore, ma stranamente il nextLine() per acquisire una String è ignorato (cioè l'esecuzione passa oltre), e la String alla fine è stampata vuota.
    codice:
    Scanner input = new Scanner(System.in);
    System.out.print("Digitare l'ID e inviare: ");
    int id = input.nextInt();
    System.out.print("Scrivere la descrizione e inviare: ");
    String de = input.nextLine();
    System.out.println("Colori disponibili: R=rosso, B=blu, G=verde");
    System.out.print("Scegliere il codice colore e inviare: ");
    char cc = input.next().charAt(0);
    System.out.print("Inserire il prezzo (virgola per i decimali) e inviare: ");
    double pr = input.nextDouble();
    System.out.println("Stili disponibili: E=elegante, S=sportiva");
    System.out.print("Scegliere lo stile e inviare: ");
    char st = input.next().charAt(0);
    Polo miaPolo = new Polo(id, de, cc, pr, st);
    Ho cercato un po', e la soluzione proposta è quella di acquisire tutto come String e successivamente convertirle con i parse delle classi wrapper.
    Altre vie? E perché succede?

    Il resto del programma si compila ed esegue tranquillamente, ma l'output riporta ovviamente la descrizione senza niente.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    ma stranamente il nextLine() per acquisire una String è ignorato (cioè l'esecuzione passa oltre), e la String alla fine è stampata vuota.
    Si tratta della "solita", conosciutissima e noiosissima questione del "mix" di nextString() (fatto dopo) con uno degli altri nextXyz() (es. nextInt, nextLong, ecc...).

    La questione è che se ad un nextInt() si scrive 123<invio> il nextInt() "consuma" solo il token 123 ma il <invio> resta da consumare. E uno "sfortunato" nextString() successivo si trova praticamente un newline di botto cioè riga "vuota".
    Non è un "baco" o errore di Scanner ... semplicemente quello è il suo funzionamento per design.

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    la soluzione proposta è quella di acquisire tutto come String e successivamente convertirle con i parse delle classi wrapper.
    Soluzione giusta e valida, specialmente se si vuole fare un piccolo strato di astrazione "sopra" Scanner, facendosi dei metodi che nascondono questi dettagli.

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Altre vie?
    Sì, dopo il nextInt() basta fare sullo scanner un skip("\\s+") che "salta" uno o più whitespace (newline compreso).
    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 L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Mi sono accorto di aver scritto, per la fretta, nextString(). Chiedo scusa, ovviamente intendevo il nextLine() (nota: nextString nemmeno esiste in Scanner, semmai next). Ma ormai non posso modificare il post.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Grazie mille Andrea.
    Di solito mi capita di inserire dati omogenei, quindi o tutti numeri o tutte String, può essere che non mi sia mai capitato questo conosciutissimo caso per dovermene occupare (non programmo di professione).
    E no, nextString() ancora non l'hanno implementato, ma avevo compreso a cosa ti riferissi.

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.