Come utilizzare Scanner per accettare solo int validi come input

Sto cercando di rendere più robusto un piccolo programma e ho bisogno di aiuto.

Scanner kb = new Scanner(System.in); int num1; int num2 = 0; System.out.print("Enter number 1: "); num1 = kb.nextInt(); while(num2 < num1) { System.out.print("Enter number 2: "); num2 = kb.nextInt(); } 
  1. Il numero 2 deve essere maggiore del numero 1

  2. Inoltre voglio che il programma controlli e ignori automaticamente se l’utente inserisce un carattere anziché un numero. Perché proprio ora quando un utente entra per esempio r invece di un numero, il programma termina.

Usa Scanner.hasNextInt() :

Restituisce true se il token successivo nell’input di questo scanner può essere interpretato come un valore int nel radix predefinito utilizzando il metodo nextInt() . Lo scanner non supera alcun input.

Ecco uno snippet per illustrare:

 Scanner sc = new Scanner(System.in); System.out.print("Enter number 1: "); while (!sc.hasNextInt()) sc.next(); int num1 = sc.nextInt(); int num2; System.out.print("Enter number 2: "); do { while (!sc.hasNextInt()) sc.next(); num2 = sc.nextInt(); } while (num2 < num1); System.out.println(num1 + " " + num2); 

Non devi parseInt o preoccuparti di NumberFormatException . Si noti che poiché i metodi hasNextXXX non hasNextXXX alcun input, potrebbe essere necessario chiamare next() se si desidera ignorare la "garbage", come mostrato sopra.

Domande correlate

  • Come posso impedire a uno scanner di generare eccezioni quando viene inserito il tipo sbagliato? (Giava)
  1. la condizione num2
  2. non sapendo cosa sia l’object kb, leggerei una String e poi try Integer.parseInt() e se non catch un’eccezione allora è un numero, se lo fai, leggi uno nuovo, magari impostando num2 Integer.MIN_VALUE e utilizzando lo stesso tipo di logica nel tuo esempio.

Questo dovrebbe funzionare:

 import java.util.Scanner; public class Test { public static void main(String... args) throws Throwable { Scanner kb = new Scanner(System.in); int num1; System.out.print("Enter number 1: "); while (true) try { num1 = Integer.parseInt(kb.nextLine()); break; } catch (NumberFormatException nfe) { System.out.print("Try again: "); } int num2; do { System.out.print("Enter number 2: "); while (true) try { num2 = Integer.parseInt(kb.nextLine()); break; } catch (NumberFormatException nfe) { System.out.print("Try again: "); } } while (num2 < num1); } } 

Prova questo:

  public static void main(String[] args) { Pattern p = Pattern.compile("^\\d+$"); Scanner kb = new Scanner(System.in); int num1; int num2 = 0; String temp; Matcher numberMatcher; System.out.print("Enter number 1: "); try { num1 = kb.nextInt(); } catch (java.util.InputMismatchException e) { System.out.println("Invalid Input"); // return; } while(num2 

Potresti provare ad analizzare la stringa in un int , ma in genere le persone cercano di evitare di lanciare eccezioni.

Quello che ho fatto è che ho definito un'espressione regolare che definisce un numero, \d indica una cifra numerica. Il segno + significa che devono esserci una o più cifre numeriche. L'extra \ davanti a \d è perché in java, il \ è un carattere speciale, quindi deve essere sfuggito.

Vedo che Character.isDigit si adatta perfettamente alla necessità, dal momento che l’input sarà solo un simbolo. Ovviamente non abbiamo alcuna informazione su questo object kb, ma nel caso si tratti di un’istanza di java.util.Scanner, suggerirei anche di usare java.io.InputStreamReader per l’input da riga di comando. Ecco un esempio:

 java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(System.in)); try { reader.read(); } catch(Exception e) { e.printStackTrace(); } reader.close(); 

Quello che potresti fare è anche prendere il token successivo come stringa, convertire questa stringa in un array di caratteri e verificare che ogni carattere nell’array sia una cifra .

Penso che sia corretto, se non vuoi affrontare le eccezioni.