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

    Gestione eccezione Input Mismatch

    Buonasera a tutti.

    Sono nuovo di Java e vorrei porvi una domanda che molto probabilmente per voi risulterà banale, ma che per me non lo è.

    Sto scrivendo un metodo che chiede all'utente di inserire di volta in volta dei valori interi attraverso il metodo nextInt della classe Scanner.

    Se l'utente inserisce un valore che non è un intero, ovviamente viene lanciata l'eccezione Input Mismatch. Utilizzando un blocco try catch, posso gestire facilmente questo tipo di eccezione, però non so cosa scrivere nel blocco catch in modo tale che l'esecuzione del metodo riprenda dal punto in cui si è verificato l'errore. Ora mi spiego meglio, inserendo il codice che avevo pensato.

    codice:
    import java.util.*; 
    public class GestioneEccezioni 
    { 
        public static void inserisciEta() 
        { 
            try 
            { 
                 Scanner s = new Scanner (System.in); 
    
                 System.out.println("Inserisci un valore per l'età di Marco"); 
                 int etaMarco = s.nextInt(); 
    
                 System.out.println("Inserisci un valore per l'età di Luca"); 
                 int etaLuca = s.nextInt(); 
    
                 System.out.println("Inserisci un valore per l'età di Matteo"); 
                 int etaMatteo = s.nextInt(); 
    
                 System.out.println("Inserisci un valore per l'età di Giovanni"); 
                 int etaGiovanni = s.nextInt(); 
            } 
    
            catch(InputMismatchException e) 
           { 
                System.out.println("Il valore inserito deve essere un intero!"); 
                inserisciEta(); 
           } 
        } 
        public static void main (String [] args) 
        { 
            inserisciEta(); 
        } 
    }
    Con questo codice, se l'utente sbaglia ad inserire ad esempio l'età di Matteo, attraverso il blocco catch stampo a video un messaggio di errore e il metodo riprende da capo la sua esecuzione, chiedendo all'utente di inserire ancora l'età di Marco e Luca, nonostante fossero stati inseriti correttamente.

    Io, vorrei che non venissero rieseguite da capo tutte le istruzioni del metodo, ma che, per rifarmi all'esempio di prima, se l'utente sbaglia ad inserire l'età di Mattero, il programma permetta all'utente di inserire un nuovo valore solamente per l'età di Matteo e poi prosegue normalmente, chiedendo di inserire eventuali valori successivi, che nel mio esempio sarebbe quello dell'età di Giovanni.

    Spero di essere riuscito a spiegarmi il meglio possibile.

    Ringrazio in anticipo tutti per l'attenzione e per un'eventuale risposta.

  2. #2
    L'ho scritto di getto e senza verificarne la correttezza. Ci sono tanti altri modi per fare la stessa cosa ed in maniera cneh più pulita, ma come idea base può andare bene:

    codice:
    import java.util.*; 
    
    public class GestioneEccezioni  { 
    
        public static void inserisciEta() { 
             Scanner s = new Scanner (System.in); 
    
             int etaMarco = getEta(s, "Marco"); 
             int etaLuca = getEta(s, "Luca"); 
             int etaMatteo = getEta(s, "Matteo"); 
             int etaGiovanni = getEta(s, "Giovanni"); 
        } 
    
        private int getEta(Scanner s, String name) {
            int eta = 0;
            try { 
                 System.out.println("Inserisci un valore per l'età di " + name); 
                 int eta = s.nextInt(); 
            } catch(InputMismatchException e) { 
                System.out.println("Il valore inserito deve essere un intero!"); 
                eta = getEta(s, name); 
            } 
            return eta;
        }
    
        public static void main (String [] args) { 
            inserisciEta(); 
        } 
    
    }
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    al max io lo scriverei così

    codice:
    import java.util.*; 
    
    public class GestioneEccezioni  { 
    
        public static void inserisciEta() { 
             Scanner s = new Scanner (System.in); 
    
             int etaMarco = getEta(s, "Marco"); 
             int etaLuca = getEta(s, "Luca"); 
             int etaMatteo = getEta(s, "Matteo"); 
             int etaGiovanni = getEta(s, "Giovanni"); 
        } 
    
        private int getEta(Scanner s, String name) {
            int eta = 0;
            boolean flag =true; 
           while (flag){
            try { 
                 System.out.println("Inserisci un valore per l'età di " + name); 
                 eta = s.nextInt(); 
                 flag = false; 
            } catch(InputMismatchException e) { 
                System.out.println("Il valore inserito deve essere un intero!"); 
            } 
         }
            return eta;
        }
    
    }
    non amo molto le funzioni ricorsive (a meno che non sia strettamente necessario), ma questo è solo un punto di vista(ovviamente), tu ci guadagni che hai 2 approcci differenti

  4. #4
    Grazie a tutti e due per le risposte.

    Ma, se io non avessi la richiesta di inserire dati che fanno riferimento sempre alla stessa cosa (nel mio esempio l'età), ma avessi dei valori che non sono correlati tra di loro?

    Ora, cerco di spiegarmi meglio.

    Se io avessi un codice di questo tipo:

    codice:
    public static void inserisciDati()
    {
       Scanner s = new Scanner (System.in);  
       
       System.out.println("Inserire la velocità della macchina:");
       int velocitaMacchina = s.nextInt();
       
       System.out.println("Inserire gli anni di Antonio");
       int etaAntonio = s.nextInt();
       
       System.out.println("Inserire il proprio numero preferito");
       int numeroPreferito = s.nextInt();
       
       System.out.println("Inserire quante zampe ha un ragno");
       int zampeRagno = s.nextInt();
    }
    La velocità, l'età ecc non sono correlate fra di solo... Come potrei gestire l'eccezione, permettendo all'utente di inserire il valore solamente per la voce per cui ha sbagliato?
    Dovrei scrivere tanti metodi tipo il vostro getEta() per ogni parametro?

    Grazie ancora per l'attenzione e per un'eventuale risposta.

  5. #5
    Originariamente inviato da jerrycvem
    Dovrei scrivere tanti metodi tipo il vostro getEta() per ogni parametro?
    Definisci un unico metodo per ottenere dall'utente un intero:
    codice:
        private static int getIntValue(Scanner s, String message) {
             // ..qui la logica che ti è stata suggerita..
        }
    Quindi, puoi scrivere:
    codice:
    public static void inserisciDati()
    {
       Scanner s = new Scanner (System.in);  
       int velocitaMacchina = getIntValue(s, "Inserire la velocità della macchina: ");
       int etaAntonio = getIntValue(s, "Inserire gli anni di Antonio: ");
    
      // ...
    
    }

  6. #6
    Grazie a tutti!

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.