Visualizzazione dei risultati da 1 a 3 su 3

Visualizzazione discussione

  1. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da bennystefa Visualizza il messaggio
    Io ho scritto questo codice, ma ho delle difficoltà a trovare la condizione di uscita dal ciclo
    Innanzitutto una cosa che vale in generale: lo Scanner connesso a System.in va istanziato UNA volta sola all'interno di una applicazione. Non va bene ricreare lo Scanner verso System.in più volte (come nel tuo ciclo). Insomma, lo dico diversamente affinché sia chiaro: fai Scanner in = new Scanner(System.in); una volta sola all'inizio della applicazione e (ri)usa sempre quell'oggetto (in) Scanner.

    Riguardo l'uso di nextDouble() (e in generale degli altri nextXXX() per cui l'input può essere inserito "malformato"), devi conoscere un aspetto fondamentale. Se il nextXXX() lancia InputMismatchException, ovvero l'input è malformato, questo token NON viene buttato via, rimane in Scanner.
    Spetta a te estrarlo in altro modo, se dovessi per esempio trattarlo in altro modo (es. int) o che altro. Se non lo estrai tu, resta in Scanner e siccome tu hai un ciclo, al prossimo nextDouble ritenterebbe di convertire quello stesso token. Ovvero NON vai avanti.
    Visto che a te non serve trattarlo in altro modo se è malformato, la cosa più semplice è "buttare via" quel token. Nel catch si dovrebbe fare semplicemente un in.next() anche senza assegnare il valore di ritorno (che è il token malformato) ad una variabile. Se si volesse, si potrebbe stamparlo per dire all'utente es. "hai inserito XXX che è errato".
    In ogni caso non lo si dovrebbe lasciare in Scanner perché altrimenti, ripeto, non si andrebbe avanti nella lettura.


    Infine c'è un aspetto importante per cui quello che ho detto prima su nextDouble al momento non ti servirebbe (ti serve solo come background). L'esercizio dice una cosa chiara:

    "al termine del programma, ovvero quando l'utente inserisce la riga vuota"

    Con nextDouble() NON puoi sapere se e quando c'è una riga vuota. In altre parole: in questo esercizio nextDouble NON ti serve. Visto che l'input è richiesto "a righe", allora dovresti usare il nextLine() che ti fornisce una stringa String. Questa può essere vuota ("") se appunto l'utente non inserisce nulla nella riga.
    Lo scenario ovviamente cambia: la stringa la devi parsare (convertire) tu in double usando il metodo parseDouble di java.lang.Double. Se la stringa è malformata, parseDouble lancia NumberFormatException, una eccezione diversa da InputMismatchException.
    Se c'è un NumberFormatException non devi più "buttare via" nulla in quanto leggi già semplicemente a righe.
    Ultima modifica di andbin; 10-12-2016 a 15:09
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.