[DOMANDA] Metodo .hasNextInt in Java!

  • Il Forum di Tom's Hardware, la più grande community dedicata all'Hardware e all'Informatica. Iscriviti Ora!
#1
Salve a tutti,
il codice che vedete qui sotto svolge una semplicissima funzione: chiede all'utente di inserire un valore compreso tra 1 e 7 e il programma stamperà a video il giorno della settimana corrispondente. Ci sono due controlli:
1- Il numero inserito non deve essere minore di 1 e maggiore di 7.
2- L'utente non deve inserire caratteri all'interno della variabile int.
Entrambi funzionano, ma volevo sapere se vi fosse un metodo per far reinserire il valore anche se l'utente inserisce una lettera anziché farlo interrompere. Ecco il codice;
Java:
import java.util.Scanner;

public class GiornoDellaSettimana {
  
    public static void main(String[] args) {
      
        Scanner inputInt=new Scanner(System.in);
      
        System.out.print("Inserisci il numero del giorno della settimana: ");
      
        int giorno=0;
        boolean controllo;
              
        do {
          
            controllo=inputInt.hasNextInt();
          
            if(controllo) {
                giorno=inputInt.nextInt();
                    if(giorno<1 || giorno>7) {
                        System.out.print("Valore errato!!! Inseriscine uno compreso tra 1 e 7: ");
                        continue;
                    }
                  
                giornoSettimana(giorno);
            }
          
            else {
                System.out.print("Hai inserito un LETTERA nel valore!!! Il programma \u00E8 stato interrotto.");
                return;
            }
          
            inputInt.close();

        }while(giorno<1 || giorno>7);
      
    }
  
    public static void giornoSettimana(int giorno) {
        switch(giorno) {
        case 1:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Luned\u00EC.");
            break;
        case 2:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Marted\u00EC.");
            break;
        case 3:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Mercoled\u00EC.");
            break;
        case 4:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Gioved\u00EC.");
            break;
        case 5:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Venerd\u00EC.");
            break;
        case 6:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Sabato.");
            break;
        case 7:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Domenica.");
            break;
        }
      
    }
  
}
 
#3
Non capisco cosa intendi, la classe .hasNextInt fa già il lavoro di controllo, se il valore passato è un numero la condizione diventa "true", altrimenti se è un carattere o misto numero+carattere (es. 2o18) la condizione è "false". Quindi non necessita di alcun do while l'inserimento perché è già in grado di capire il valore inserito e grazie alla variabile booleana poi andrà nel ciclo if-else.
 
#4
E se tu provassi a far inserire una stringa all'utente e poi racchiudere in un try catch un metodo che converte la stringa in intero.
Poi nel catch ci metti l'avviso che il numero è scritto in maniera errata e metti una variabile booleana alla quale viene assegnato il valore false nel caso la stringa contenga una lettera.
Racchiudi tutto in un do while che continua finché il valore è true.
Poi metti il resto del controllo.
Spero di essere stato chiaro

Inviato da SLA-L02 tramite App ufficiale di Tom\'s Hardware Italia Forum
 
Mi Piace: Akrilix
#5
E se tu provassi a far inserire una stringa all'utente e poi racchiudere in un try catch un metodo che converte la stringa in intero.
Poi nel catch ci metti l'avviso che il numero è scritto in maniera errata e metti una variabile booleana alla quale viene assegnato il valore false nel caso la stringa contenga una lettera.
Racchiudi tutto in un do while che continua finché il valore è true.
Poi metti il resto del controllo.
Spero di essere stato chiaro

Inviato da SLA-L02 tramite App ufficiale di Tom\'s Hardware Italia Forum
Sei stato chiarissimo, ma la classe .hasNextInt fa già ciò che hai scritto te, riceve un valore da un utente sotto forma di stringa e controlla che non vi siano caratteri, se così fosse si entra nell'if (True) e la stringa viene convertita in int.
Inoltre il try catch non lo ho ancora fatto, quindi non posso usarlo.
 

rodhellas

Utente Attivo
1,415
377
Hardware Utente
CPU
Intel i5 3470
Scheda Madre
AsRock H77 pro4/mvp
Hard Disk
120GB SSD + 1TB HD
RAM
12GB Corsair XMS3 1333mhz
Scheda Video
Gigabyte GTX 960 OC
Scheda Audio
Integrata
Monitor
SyncMaster 223BW
Alimentatore
Antec HCG-520M
Case
Thermaltake Commander Ms-i Snow Edition
Sistema Operativo
Windows 10 64bit
#7
else {
System.out.print("Hai inserito un LETTERA nel valore!!! Il programma \u00E8 stato interrotto.");
return;
}
Togli il return, il continue (inutile) e sposta fuori dal while inputInt.close() e funziona come hai chiesto.
Cerca di capire bene a cosa serva il return..
 
#8
Ciao,
ho fatto come da te consigliato, ma ora se inserisco un carattere il programma si imballa e non da più segni. Ho provato a modificare altri blocchi ma non mi funziona niente.
Ti riposto il codice modificato come scritto da te:

Java:
import java.util.Scanner;

public class GiornoDellaSettimana {
    
    public static void main(String[] args) {
        
        Scanner inputInt=new Scanner(System.in);
        
        System.out.print("Inserisci il numero del giorno della settimana: ");
        
        int giorno=0;
        boolean controllo;
                
        do {
            
            controllo=inputInt.hasNextInt();
            
            if(controllo) {
                giorno=inputInt.nextInt();
                    if(giorno<1 || giorno>7)
                        System.out.print("Valore errato!!! Inseriscine uno compreso tra 1 e 7: ");
            }
            
            else {
                System.out.print("Hai inserito un LETTERA nel valore!!! Il programma \u00E8 stato interrotto.");
            }

        }while(giorno<1 || giorno>7);
        
        giornoSettimana(giorno);
        
        System.out.print("Prova");
        
        inputInt.close();
        
    }
    
    public static void giornoSettimana(int giorno) {
        switch(giorno) {
        case 1:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Luned\u00EC.");
            break;
        case 2:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Marted\u00EC.");
            break;
        case 3:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Mercoled\u00EC.");
            break;
        case 4:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Gioved\u00EC.");
            break;
        case 5:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Venerd\u00EC.");
            break;
        case 6:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Sabato.");
            break;
        case 7:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Domenica.");
            break;
        }
        
    }
    
}
Post unito automaticamente:

Ho provato a modificare anche la condizione del do-while mettendo di rieseguire anche se controllo==false, ma non mi funziona. Magari ignoro qualche regola sintattica???
 

rodhellas

Utente Attivo
1,415
377
Hardware Utente
CPU
Intel i5 3470
Scheda Madre
AsRock H77 pro4/mvp
Hard Disk
120GB SSD + 1TB HD
RAM
12GB Corsair XMS3 1333mhz
Scheda Video
Gigabyte GTX 960 OC
Scheda Audio
Integrata
Monitor
SyncMaster 223BW
Alimentatore
Antec HCG-520M
Case
Thermaltake Commander Ms-i Snow Edition
Sistema Operativo
Windows 10 64bit
#9
Ciao,
ho fatto come da te consigliato, ma ora se inserisco un carattere il programma si imballa e non da più segni. Ho provato a modificare altri blocchi ma non mi funziona niente.
Ti riposto il codice modificato come scritto da te:

Java:
import java.util.Scanner;

public class GiornoDellaSettimana {
   
    public static void main(String[] args) {
       
        Scanner inputInt=new Scanner(System.in);
       
        System.out.print("Inserisci il numero del giorno della settimana: ");
       
        int giorno=0;
        boolean controllo;
               
        do {
           
            controllo=inputInt.hasNextInt();
           
            if(controllo) {
                giorno=inputInt.nextInt();
                    if(giorno<1 || giorno>7)
                        System.out.print("Valore errato!!! Inseriscine uno compreso tra 1 e 7: ");
            }
           
            else {
                System.out.print("Hai inserito un LETTERA nel valore!!! Il programma \u00E8 stato interrotto.");
            }

        }while(giorno<1 || giorno>7);
       
        giornoSettimana(giorno);
       
        System.out.print("Prova");
       
        inputInt.close();
       
    }
   
    public static void giornoSettimana(int giorno) {
        switch(giorno) {
        case 1:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Luned\u00EC.");
            break;
        case 2:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Marted\u00EC.");
            break;
        case 3:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Mercoled\u00EC.");
            break;
        case 4:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Gioved\u00EC.");
            break;
        case 5:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Venerd\u00EC.");
            break;
        case 6:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Sabato.");
            break;
        case 7:
            System.out.print("Il giorno numero " +giorno +" della settimana \u00E8 Domenica.");
            break;
        }
       
    }
   
}
Post unito automaticamente:

Ho provato a modificare anche la condizione del do-while mettendo di rieseguire anche se controllo==false, ma non mi funziona. Magari ignoro qualche regola sintattica???
Ti va in un ciclo infinito perchè non pulisci il buffer di inputInt. Nel ramo else, aggiungi inputInt.nextLine(); (cosi paro paro) per pulire il buffer.
 
#10
Funziona, ma ne ho dovuti mettere due, altrimenti mi stampava l'output 2 volte di seguito... Come mai?
Java:
else {
                inputInt.nextLine();
                System.out.print("Hai inserito un LETTERA nel valore!!! Reinserisci il numero: ");
                inputInt.nextLine();
            }
 

rodhellas

Utente Attivo
1,415
377
Hardware Utente
CPU
Intel i5 3470
Scheda Madre
AsRock H77 pro4/mvp
Hard Disk
120GB SSD + 1TB HD
RAM
12GB Corsair XMS3 1333mhz
Scheda Video
Gigabyte GTX 960 OC
Scheda Audio
Integrata
Monitor
SyncMaster 223BW
Alimentatore
Antec HCG-520M
Case
Thermaltake Commander Ms-i Snow Edition
Sistema Operativo
Windows 10 64bit
#11
Funziona, ma ne ho dovuti mettere due, altrimenti mi stampava l'output 2 volte di seguito... Come mai?
Java:
else {
                inputInt.nextLine();
                System.out.print("Hai inserito un LETTERA nel valore!!! Reinserisci il numero: ");
                inputInt.nextLine();
            }
A me stampa una sola volta l'output..
 

Discussioni Simili