Como posso verificar com segurança a input de números inteiros?

Scanner scanner = new Scanner(); int number = 1; do { try { option = scanner.nextInt(); } catch (InputMismatchException exception) { System.out.println("Integers only, please."); } } while (number != 0); 

Apesar do tratamento de exceções, esse código entrará em um loop infinito quando a input não inteira é fornecida. Em vez de o Scanner pausar para coletar dados na próxima iteração, ele simplesmente continua lançando InputMismatchException s até o programa ser eliminado.

Qual é a melhor maneira de procurar por inteiro (ou outro tipo, suponho) input, descartando input inválida e continuando o loop normalmente?

Você deve verificar se a input pode ou não ser analisada como um int antes de tentar atribuir o valor da input a um int. Você não deveria estar usando uma exceção para determinar se a input está correta ou não, é uma má prática e deve ser evitada.

 if(scanner.hasNextInt()){ option = scanner.nextInt(); }else{ System.out.printLn("your message"); } 

Dessa forma, você pode verificar se a input pode ou não ser interpretada como um int e, se assim for, atribuir o valor e, se não, exibir uma mensagem. Chamar esse método não avança o scanner.

mude seu código para isso

 catch (InputMismatchException exception) { System.out.println("Integers only, please."); scanner.nextLine(); } 

Do javadoc: Este método lançará InputMismatchException se o próximo token não puder ser convertido em um valor int válido, conforme descrito abaixo. Se a tradução for bem sucedida, o scanner avança além da input correspondente.

Observe a segunda frase lá, só avança se for bem sucedida. Isso significa que você precisará alterar seu bloco catch para algo como o seguinte:

 catch (InputMismatchException exception) { System.out.println("Integers only, please."); scanner.next(); } 

Acho que isso é melhor

 import java.util.*; class IntChkTwo{ public static void main(String args[]){ Scanner ltdNumsScan = new Scanner(System.in); int ltdNums = 0; int totalTheNums = 0; int n = 4; System.out.print("Enter Five Numbers: "); for(int x=0;x<=n;x++){ try{ ltdNums = ltdNumsScan.nextInt(); totalTheNums = totalTheNums + ltdNums; }catch(InputMismatchException exception){ n+=1;//increases the n value //maintains the same count of the numbers //without this every error is included in the count System.out.println("Please enter a number"); ltdNumsScan.nextLine(); }//catch ends }//for ends int finalTotalNums = totalTheNums; System.out.println("The total of all of the five numbers is: "+finalTotalNums); } } 

Eu estava confuso com o exemplo de código, então eu tive que reescrevê-lo. Espero que isso ajude você mesmo tem sido anos. Eu sei que é diferente, mas quando tentei adicionar os números usando o código de exemplo, fiquei confuso ao longo do caminho.

No início, o que me incomodava era contar o erro.

Eu prefiro acabar com o loop do-while, tentei antes e se você perder alguma coisa, ele passa para um loop infinito.

Se ele varrer uma variável não-int, a exceção será exibida, se não o sinalizador será true e o loop será encerrado.

 Scanner scanner = new Scanner(); int number = 1; boolean flag = false; do { try { option = scanner.nextInt(); flag=true; } catch (InputMismatchException exception) { System.out.println("Integers only, please."); } } while ( flag );