class Question{
public static void main(String[] args) throws Exception{
try{
int i=5/(int)Math.random();
System.out.println("i="+i);
} catch(ArithmeticException ae) {
throw new Exception("thrown from first catch");
} catch(Exception e){
throw new Exception("thrown from second catch");
} finally {
return;
}
}
}
Esse código tenta lançar uma Exception dentro de um bloco catch, e mesmo lançando a Exception o programa roda sem nenhuma output ! Mesmo com o return no finally eu imaginava que a Exception fosse lançada e finalizasse a execução do programa na hora…
Alguém pode me explicar por que neste código a Exception não finaliza o programa ?
valeu mesmo !
Editei por que falei algumas besteiras…hehehee
O programa nao mostra nenhuma exceçao porque o tratamento que voce está dando a ela no “catch” lança uma nova exceção para quem chamou a função, que no caso foi a jvm…e como não há mais função na pilha de chamadas, o programa encerra.
Edit2: Esse output apareceria se voce colocasse umSystem.out.println dentro do catch, ou entao mandasse imprimir um stackTrace dentro do mesmo.
Discordo do colega douglas_vidotto…
Não aparece nenhum stack, não aparece nenhuma mensagem, porque no bloco finally existe um return vazio. A regra é a seguinte: pode acontecer qualquer coisa mas o finally sempre será executado.
Experimente colocar um Sytem.out no bloco finally e você verá a mensagem na console:
finally {
System.out.println("caiu aqui");
return;
}
Abraço
É isso, deveria aparecer a pilha, mas não aparece…
Realmente o bloco finally é executado sempre, só um System.exit(0) não vai fazê-lo executar, mas mesmo assim deveria aparecer a pilha da exceção né ?
Neste caso não, porque o finally vai “engolir” a exceção, o que você pode fazer para exibir é exceção é colocar um printStackTrace() em cada bloco catch.
Com isso o devido bloco catch irá rodar, exibir a pilha e o throw seria “substituido” pelo finally.
Ou ainda colocar isso numa variável do método caso você queira manipular no finally.
class Question {
public static void main(String[] args) throws Exception {
Exception exception = null;
try {
int i = 5 / (int) Math.random();
System.out.println("i=" + i);
} catch (ArithmeticException ae) {
exception = ae;
//ae.printStackTrace();
//throw new Exception("thrown from first catch");
} catch (Exception e) {
exception = e;
//e.printStackTrace();
//throw new Exception("thrown from second catch");
} finally {
exception.printStackTrace();
System.out.println("caiu aqui");
return;
}
}
Abraço
Concordo com o Maicon que o finally sempre é executado. Porém a dúvida era o porque não aparecia nenhum output quando executava o programa, mesmo quando as exceções são lançadas. Isso ocorre porque o Will não colocou nenhum System.out ou stackTrace dentro dos catches. Se ele colocar o output no finally, vai aparecer algo escrito na tela, independente de lançar a exceção ou não. Caso queira ver a lista de exceção, voce deve chamar o método printStackTrace do objeto da exceção caputarda.
ex:
1. class Question{
2. public static void main(String[] args) throws Exception{
3. try{
4. int i=5/(int)Math.random();
5. System.out.println("i="+i);
6. } catch(ArithmeticException ae) {
7. ae.printStackTrace();
8. } catch(Exception e){
9. e.printStackTrace();
10. } finally {
11. System.out.println("Sempre executarei indepente da excecao");
12. }
Edit: Se voce colocar os printStackTrace dentro dos catches, o finally nao engolira a exceçao, independente do que estiver la dentro… ele imprimirá o que estiver no bloco catch, e depois executará o que estiver em finally.
Abraços!
Resumo: eu e o Douglas dissemos a mesma coisa só que de forma diferente hauhauhauhau
Respondendo post na segunda 00:26… E amanhã o bicho vai pegar…
Vão durmir hehehehe
abraço
hehehehe…falou e disse…demorou pra eu ir debaixo das cobertas…o gelo!!