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 ?
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.
maiconramones
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:
É 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é ?
maiconramones
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
douglas_vidotto
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.classQuestion{2.publicstaticvoidmain(String[]args)throwsException{3.try{4.inti=5/(int)Math.random();5.System.out.println("i="+i);6.}catch(ArithmeticExceptionae){7.ae.printStackTrace();8.}catch(Exceptione){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!
maiconramones
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
douglas_vidotto
hehehehe…falou e disse…demorou pra eu ir debaixo das cobertas…o gelo!!