Try...catch estruture de repetição

quero saber qual é a sintaxe correto da estrutura de repetição enquanto o atributo ‘idade’ ta sendo lido por um caractere incorretamente até que o input leia um integer dentro do catch(Exception e).

try {
System.out.print(“Quantos anos você tem " + this.nome +”? ");
this.idade = digite.nextInt();
} catch(Exception e){
System.out.println(“caracteres não é um tipo primitivo numérico.”);
System.out.print("Informe a sua idade corretamente: ");
this.idade = digite.nextInt();
while() { // erro de estrutura de repetição
System.out.print("por favor digite a sua idade correta: ");
this.idade = digite.nextInt();
}
}

Você deveria colocar os comandos de validação dentro do try, deixando o catch apenas para exceções, para que não exiba mensagem de erro sem um tratamento adequado para o usuário.

try {
 boolean idadeInformada = false;
 Scanner sc = new Scanner(System.In);
 while ( ! idadenformada ) {
    System.out.print(“Quantos anos você tem " + this.nome +”? ");
    String idade  = sc.nextLine();
    // Testar se idade é numérica
    // Senão imprimir a mensagem
    System.out.println(“caracteres não é um tipo primitivo numérico.”);
    System.out.print("Informe a sua idade corretamente: ");
  // Se for  numérica
  this.idade = Integer.parseInt(idade);
  idadeInformada = true;
  sc.close();
  }  
 } catch(Exception e){
 }
}

Outra maneira seria:
boolean idadeInformada = false;
Scanner sc = new Scanner(System.In);
while ( ! idadeInformada ) {
try {
System.out.print(“Quantos anos você tem " + this.nome +”? ");
String idade = sc.nextLine();
this.idade = Integer.parseInt(idade);
idadeInformada = true;
sc.close();
} catch(NumberFormatException nfe) {
System.out.println(“caracteres não é um tipo primitivo numérico.”);
System.out.print("Informe a sua idade corretamente: ");

       }
   }
1 curtida

As boas práticas de programação dizem para evitar o try/catch dentro de estruturas de repetição. Causam lentidão.

2 curtidas

muito obrigado pela ajuda!

Apenas para acrescentar…

A partir da versão 7 do java, você pode sequenciar diferentes tipos de exceção para serem capturadas pelo mesmo bloco try/cath. É o chamado try multiple catch.
Ao invés de fazer isso:

try {
    //Do something
}catch (IOException ex) {
     logger.log(ex);
     throw ex;
catch (SQLException ex) {
     logger.log(ex);
     throw ex;
}

Você pode, simplesmente, fazer isso:

try {
     //Do something
} catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

Detalhes

1 curtida