Dúvida sobre exceptions

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!!