DOMANDA Metodo .hasNextInt in Java!

Akrilix

Nuovo Utente
145
32
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;
        }
      
    }
  
}
 

Akrilix

Nuovo Utente
145
32
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.
 

Mauro2004

Nuovo Utente
47
8
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
Reazioni: Akrilix

Akrilix

Nuovo Utente
145
32
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 Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
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..
 

Akrilix

Nuovo Utente
145
32
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 Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
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.
 

Akrilix

Nuovo Utente
145
32
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 Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
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..
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!