Gestione input

di il
3 risposte

Gestione input

Ciao!
Vorrei gestire l'input in modo tale che se l'utente inserisce un valore negativo viene richiesto nuovamente l'input, fino a quando non viene inserito un valore positivo.
lo faccio tramite while(valore < 0), ma perchè non funziona?

public class CatturaInput {
    
    // metodo statico che consente di leggere una linea dallo standard input
    // sotto forma di stringa 
    public static String leggiLinea(){
        String appenaLetta = null;
        // oggetto wrapper per rendere evoluto 
        // System.in e poter leggere un'intera linea
        // come stringa.
        BufferedReader bRead;
        
        // inizializzo l'oggetto wrapper sopra System.in
        bRead = new BufferedReader(new InputStreamReader(System.in));
        
        // ora vado a leggere una linea da standard input
        try{
            appenaLetta = bRead.readLine();
        }catch(IOException e){
            System.out.println("Impossibile leggere da standard IO");
            appenaLetta = "ERRORE DI IO";
        }
        return appenaLetta;
    } // end metodo LeggiLinea()
    
    // metodo statico che  legge una linea dallo standard input  e cerca di 
    // convertirla in intero
    public static int leggiProssimoIntero(){
        int valore = -1;
        String linea = CatturaInput.leggiLinea();
        
        // ora vado ad effettuare la traduzione in intero
        try{
             while(valore <0)
                  valore = Integer.parseInt(linea);
        }catch(NumberFormatException e){
            System.out.println("Impossibile tradurre in intero: ");
            System.out.println(e);
            // se l'utente inserisce un formato non traducibile in intero,
            // lo trasformo nel valore di default : 3
            System.out.println("Viene inserito il valore di default : 3");
            valore = 3;
        }
        return valore;
    } // end metodo leggiProssimoIntero()
} // end classe

3 Risposte

  • Re: Gestione input

    Frank2000 ha scritto:


    lo faccio tramite while(valore < 0), ma perchè non funziona?
    Perché nel while ripeti solo il parseInt ma non l'input dall'utente!

    E comunque non è molto buono il leggiLinea(), perché ad ogni sua invocazione crei un nuovo BufferedReader connesso a System.in.
    Di BufferedReader connesso a System.in ne dovresti avere UNO solo per tutta la vita della applicazione.
  • Re: Gestione input

    andbin ha scritto:


    Frank2000 ha scritto:


    lo faccio tramite while(valore < 0), ma perchè non funziona?
    Perché nel while ripeti solo il parseInt ma non l'input dall'utente!

    E comunque non è molto buono il leggiLinea(), perché ad ogni sua invocazione crei un nuovo BufferedReader connesso a System.in.
    Di BufferedReader connesso a System.in ne dovresti avere UNO solo per tutta la vita della applicazione.
    Grazie. ho risolto facendo così nel main :
    
     // l'utente inserisce il numero di sensori
            do{
                System.out.print("Inserire il numero di sensori: ");
                numSensori = CatturaInput.leggiProssimoIntero();
            } while(numSensori < 1);
            System.out.println("Numero sensori inserito: " + numSensori);
    
    e lasciando praticamente uguale la classe di prima
    
    public class CatturaInput {
        
        // metodo statico che consente di leggere una linea dallo standard input
        // sotto forma di stringa 
        public static String leggiLinea(){
            String appenaLetta = null;
            // oggetto wrapper per rendere evoluto 
            // System.in e poter leggere un'intera linea
            // come stringa.
            BufferedReader bRead;
            
            // inizializzo l'oggetto wrapper sopra System.in
            bRead = new BufferedReader(new InputStreamReader(System.in));
            
            // ora vado a leggere una linea da standard input
            try{
                appenaLetta = bRead.readLine();
            }catch(IOException e){
                System.out.println("Impossibile leggere da standard IO");
                appenaLetta = "ERRORE DI IO";
            }
            return appenaLetta;
        } // end metodo LeggiLinea()
        
        // metodo statico che  legge una linea dallo standard input  e cerca di 
        // convertirla in intero
        public static int leggiProssimoIntero(){
            int valore = -1;
            String linea = CatturaInput.leggiLinea();
            
            // ora vado ad effettuare la traduzione in intero
            try{
                 valore = Integer.parseInt(linea);
            }catch(NumberFormatException e){
                System.out.println("Impossibile tradurre in intero. Inserire di nuovo ");
                System.out.println(e);
            }
            return valore;
        } // end metodo leggiProssimoIntero()
    } // end classe
    
    Come posso risolvere il problema dell'unico buffer reader?
  • Re: Gestione input

    Frank2000 ha scritto:


    Come posso risolvere il problema dell'unico buffer reader?
    Ci sono diversi design possibili, tra cui rendere la tua classe di input un "singleton".
    Ma la cosa più semplice è:
    public class CatturaInput {
        private static final BufferedReader bRead = new BufferedReader(new InputStreamReader(System.in));
        
        // usa bRead nei metodi ...
    }
Devi accedere o registrarti per scrivere nel forum
3 risposte