Como usar o Scanner para aceitar apenas int válido como input

Estou tentando tornar um pequeno programa mais robusto e preciso de ajuda com isso.

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. Número 2 tem que ser maior que o número 1

  2. Também quero que o programa verifique e ignore automaticamente se o usuário inserir um caractere em vez de um número. Porque agora, quando um usuário digita, por exemplo, em vez de um número, o programa simplesmente sai.

Use Scanner.hasNextInt() :

Retorna true se o próximo token na input deste scanner puder ser interpretado como um valor int na base padrão usando o método nextInt() . O scanner não avança além de qualquer input.

Aqui está um trecho para ilustrar:

 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); 

Você não precisa parseInt ou se preocupar com NumberFormatException . Note que como os methods hasNextXXX não avançam além de qualquer input, você pode ter que chamar next() se você quiser pular o "lixo", como mostrado acima.

Perguntas relacionadas

  • Como evito que um scanner lance exceções quando o tipo errado é typescript? (Java)
  1. a condição num2
  2. não sabendo qual é o object kb, eu li uma String e depois try Integer.parseInt() e se você não catch uma exceção então é um número, se você ler uma nova, talvez definindo num2 para Integer.MIN_VALUE e usando o mesmo tipo de lógica em seu exemplo.

Isso deve funcionar:

 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); } } 

Tente isto:

  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 

Você pode tentar analisar a string em um int também, mas geralmente as pessoas tentam evitar exceções.

O que eu fiz é que eu defini uma expressão regular que define um número, \d significa um dígito numérico. O sinal + significa que deve haver um ou mais dígitos numéricos. O extra \ na frente do \d é porque, em java, o \ é um caractere especial, portanto, ele deve ser escapado.

Vejo que Character.isDigit atende perfeitamente à necessidade, já que a input será apenas um símbolo. É claro que não temos nenhuma informação sobre esse object kb, mas caso seja uma instância java.util.Scanner, sugiro também usar java.io.InputStreamReader para input de linha de comando. Aqui está um exemplo:

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

O que você poderia fazer é também tomar o próximo token como String, converter essa string em uma matriz char e testar se cada caractere da matriz é um dígito .

Eu acho que está correto, se você não quer lidar com as exceções.