Exception loop

Boa noite pessoal. Por favor busco a ajuda de vocês, paladinos das artes computacionais!!!

Basicamente busco uma forma de tratar exceções “elegantemente”. Já vi exemplos em um livro em que o autor trata elas da seguinte forma:

  • cria uma variável do tipo boolean com conteudo false;
  • coloca todo o bloco try/catch dentro de um do{}while()
  • se não entrar dentro do catch, a váriavel segue como false, e sai de dentro do bloco do{}while(), terminando o loop com o try/catch.

A primeira dúvidas é:

  • Como tratar essas exceções de forma elegante, não deixando que o programa encerre?

Logo depois eu percebi que dentro de um bloco catch também pode haver uma exceção (usuário teimoso pacas), logo apareceu minha segunda dúvida:

  • Existe um modo de tratar essa exceção sem precisar reescrever todo o bloco try/catch?

Vamos por partes. Você está falando de um sistema web ou desktop?
Onde estaria esse loop?

Basicamente seria isso drsmachado, perdoe a falta de informações. Seria sim para uma aplicação desktop.

do{
	try{
			
		System.out.print("Entre com o numero: ");
		int num1 = input.nextInt();
		System.out.println((num1/0));
		continueLoop = false;
		
		}
		catch(ArithmeticException e){
			System.out.println("Não dividirás por 0!!!");
		}

	}while(continueLoop);
     }
}

Não sei qual autor você leu, mas posso te dizer que uma melhor abordagem seria colocar o try/catch fora do laço de repetição, apenas pela questão de desempenho.

Neste caso iria completamente contra o pretendido. O laço está lá precisamente para obrigar a repetir quando cair na Exception.

Não necessariamente, ele poderia, simplesmente, inverter a validação do loop while(!continuaLoop);

Eu sempre tenho um pé atrás com a palavra “elegante” pois acho isso bem subjetivo.

Mas analisando seu código, nós podemos identificar que tem duas coisas acontecendo nele:

  • Você recebe um número que o usuário digita e divide por 0 (aliás, isso sempre vai dar erro, mas enfim…)
  • Você tem um mecanismo para ficar tentando múltiplas vezes até o usuário acertar (nesse caso impossível)

Podemos dizer que a primeira parte é sua lógica de negócio e a segunda parte é uma estrutura de controle.

No java 8, você pode passar funçoes como argumentos e usar lambdas. Isso te permite criar estruturas de controles que nao existem prontas na linguagem.

Uma soluçao nesse caso, seria criar um método para cuidar da parte de repetiçao em caso de falha, enquanto deixa sua lógica de negócio intacta, sem flags como continueLoop poluindo seu código.

Algo assim:

public static void main(String[] args) throws Exception {

    Scanner input = new Scanner(System.in);

    continueTentando(() -> {
      System.out.print("Entre com o numero: ");
      int num1 = input.nextInt();
      System.out.println((1 / num1));
    }); 
}
  public static void continueTentando(Runnable action) {
    while (true) {
      try {
        action.run();
        return;
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }

Dessa forma você isolou sua lógica de negócio da estrutura de controle de continuar tentando.

PS: Nao consigo formatar a segunda parte corretamente sei lá porque.