Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Gestione delle eccezioni e condizione uscita da un ciclo

    Ciao a tutti,
    io sto facendo il seguente esercizio:
    "Scrivere un programma che chieda all'utente di inserire un insieme di valori in virgola mobile.Quando viene inserito un valore che non sia un numero, consentite all'utente tutti i tentativi necessari per inserire un valore corretto. Sommate tutti i valori specificati in modo corretto e poi visualizzate il totale al termine del programma, ovvero quando l'utente inserisce la riga vuota."

    Io ho scritto questo codice, ma ho delle difficoltà a trovare la condizione di uscita dal ciclo

    import java.util.InputMismatchException;
    import java.util.Scanner;


    public class Test
    {
    public static void main(String[] args)
    {
    boolean done = false;
    double count = 0;
    while(!done)
    {
    try
    {
    Scanner in = new Scanner(System.in);
    System.out.println("Inserisci un valore: ");
    double num = in.nextDouble();
    count = count + num;
    //condizione di uscita dal ciclo ??

    }
    catch (InputMismatchException e)
    {
    System.out.println("Valore non valido");
    }
    }

    System.out.println("La somma è: " + count);
    }
    }


    Grazie in anticipo a chi riesca a darmi una mano

  2. #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

  3. #3
    Sei stato chiarissimo, grazie mille, così sono riuscita a risolvere

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.