Ola pessoal,
Eu percebi que ao fazermos o try catch
sem o throw new ..., o programa retorna ao primeiro metodo invocado, bem como termina de ler o resto do metodo onde o erro ocorreu.
Já o try catch
sem throw new ..., ele encerra onde o erro ocorreu e não faz mais nada, fazendo com que o programa seja encerrado através do primeiro metodo invocado. Está correto isso?
Se sim, isso quer dizer que damos um throw new... para evitar que a aplicação leia o resto do metodo posterior ao problema ocorrido nele?
Segue abaixo dois testes que fiz. O nome da classe descreve o cenário que eu entendi:
package br.com.alura.exceptions;
public class FluxoComInterrupcao {
public static void main(String[] args) {
System.out.println("Ini do main");
try {
metodo1();
} catch (ArithmeticException | NullPointerException | MinhaExcecao ex) {
String msg = ex.getMessage();
System.out.println("Exception do metodo1 " + msg);
ex.printStackTrace();
}
System.out.println("Fim do main");
}
private static void metodo1() throws MinhaExcecao {
System.out.println("Ini do metodo1");
metodo2();
System.out.println("Fim do metodo1");
}
private static void metodo2() throws MinhaExcecao {
System.out.println("Ini do metodo2");
int d = 1 / 0;
for (int i = 1; i <= 5; i++) {
System.out.println(i);
Cliente c = null;
c.deposita();
throw new MinhaExcecao("deu muito errado");
}
int a = 1;
int b = 2;
System.out.println(a + b);
System.out.println("Fim do metodo2");
}
}
Resultado: Ini do main
Ini do metodo1
Ini do metodo2
Exception do metodo1 / by zero
java.lang.ArithmeticException: / by zero
Fim do main
at .br.com.alura.exceptions.FluxoComInterrupcao.metodo2(FluxoComInterrupcao.java:28)
at .br.com.alura.exceptions.FluxoComInterrupcao.metodo1(FluxoComInterrupcao.java:21)
at .br.com.alura.exceptions.FluxoComInterrupcao.main(FluxoComInterrupcao.java:9)
Reparem que a classe acima não leu o resto do último metodo 2 onde o erro ocorreu. Lembrando que o erro ocorreu antes do metodo 2 terminar, ou seja, ele não somou as variaveis a** e **b
Agora, a segunda classe:
package br.com.alura.exceptions;
public class Fluxo {
public static void main(String[] args) {
System.out.println("Ini do main");
metodo1();
System.out.println("Fim do main");
}
private static void metodo1() {
System.out.println("Ini do metodo1");
metodo2();
System.out.println("Fim do metodo1");
}
private static void metodo2() {
System.out.println("Ini do metodo2");
try {
int a = 1 / 0;
for (int i = 1; i <= 5; i++) {
System.out.println(i);
Cliente c = null;
c.deposita();
}
} catch (Exception e) {
e.printStackTrace();
}
int a = 1;
int b = 4;
System.out.println(a + b);
System.out.println("Fim do metodo2");
}
}
Ini do main
Ini do metodo1
Ini do metodo2
5
Fim do metodo2
Fim do metodo1
Fim do main
java.lang.ArithmeticException: / by zero
at br.com.alura.exceptions.Fluxo.metodo2(Fluxo.java:25)
at br.com.alura.exceptions.Fluxo.metodo1(Fluxo.java:16)
at br.com.alura.exceptions.Fluxo.main(Fluxo.java:9)
Perceberam que aqui, o metodo 2 continua a executar a lógica, mesmo que tenha ocorrido erro em alguma lógica anterior dentro do metodo 2?
Obgdo galera