Tratamento de exceção

public class Excecao {



public static void main(String[] args) {
	Scanner teclado = new Scanner(System.in);
	System.out.println("sistema que calcula a divisão de 2 números.\n");

	try {
	System.out.println("informe o primeiro valor: ");
	int a = teclado.nextInt();
	System.out.println("informe o segundo valor: ");
	int b = teclado.nextInt();

	double c =a/b;
	
	System.out.println("o resultado da divisão é: " + c);
	}

	
	catch(InputMismatchException e){
		
		System.out.println("número inválido, digite um número inteiro.");
		
	
	}

	catch(ArithmeticException e2) {
		
		System.out.println("não é possível dividir por 0");
	}		

}

}

como faço para que mesmo depois da mensagem o usuário continuar digitando um número até não aparecer mais o aviso de erro?

A única maneira de fazer isso é incluir o bloco todo dentro de um laço de repetição (for/while/do-while).
Porém, essa não é uma boa prática, seria mais interessante fazer o contrário: incluir o laço dentro do bloco try. Como isso resultaria no mesmo comportamento (digitar um valor > lançar exceção > capturar e tratar > apresentar erro > finalizar a execução), não é o que você quer fazer.

1 curtida

e qual seria a condição de parada desse suposto bloco while?

1 curtida

Qual a razão pela qual você quer que esse trecho de código se repita mesmo?

2 curtidas

Tenta aí:

import java.util.*;

class Program {

  private static int promptInt (String prompt) {
    System.out.printf("%s: ", prompt);
    return new Scanner(System.in).nextInt();
  }

  public static void main (String[] args) {
    Scanner input = new Scanner(System.in);
    int a, b;
    while (true) {
      try {
        a = promptInt("A");
        b = promptInt("B");
        break;
      } catch (NoSuchElementException ex) {
        System.out.println("Numero invalido, tente novamente.");
      } catch (IllegalStateException ex) {
        System.out.println("Erro em STDIN.");
        System.exit(1);
      }
    }
    System.out.printf("%d, %d%n", a, b);
  }
}

Alternativa (com o loop por variável que vc quiser ler):

import java.util.*;

class Program {

  private static int promptInt (String prompt) {
    while (true) {
      try {
        System.out.printf("%s: ", prompt);
        return new Scanner(System.in).nextInt();
      } catch (NoSuchElementException ex) {
        System.out.println("Numero invalido, tente novamente.");
      } catch (IllegalStateException ex) {
        System.out.println("Erro em STDIN.");
        System.exit(1);
      }
    }
  }

  public static void main (String[] args) {
    Scanner input = new Scanner(System.in);
    int a, b;
    a = promptInt("A");
    b = promptInt("B");
    System.out.printf("%d, %d%n", a, b);
  }
}
1 curtida

o exercicio pede que o usuário digite várias vezes até a mensagem de erro desaparecer

Cara, vou colocar um exemplo bem tosco:

int x = 10, numero;
do {
    try {
        System.out.println("Adivinhe o número");
        numero = Integer.parseInt(scanner.nextLine());
        if(numero != x) {
            throw new Exception("Você errou!");
        }
    } catch (Exception ex) {
         ex.printStackTrace();
    }
} while(numero != x);
System.out.println("Você acertou!");

Cara, o seguinte, você usa
while(true){}, envolvendo todo o try-catch
e após a linha impressão do resultado (se chegou nessa linha quer dizer que ocorreu tudo certo e a mensagem de erro não foi mais exibida) você simplesmente coloca um
break;
Vai na fé que dá certo, rsrs

3 curtidas

eu tava tentando de um jeito mas tava dando um bug, tentei do seu e realmente funcionou. muito obrigado!!

1 curtida