A exceçao nao deveria ser tratada dentro de main?
Estou estudando para a OCJP mas eu jurava que quando uma exceção é lançada(atravéz do throw) ela deveria ser tratada no bloco aonde foi invocada , e não dentro do proprio método.
Aonde estou errando?
Obrigado !
Vamos por partes…
Na linha 4 você chama o método m1().
Isso leva a execução diretamente à linha 14, onde você lança uma Exception genérica.
A linha 14 está dentro de um try-catch cujo catch trata justamente o tipo genérico de Exception (ou qualquer subtipo, mas não é o caso).
Aí a execução vai para a linha 17 onde o stackTrace é impresso no console e finalmente na linha 19 é impresso “m1catch”.
Nessa altura da execução não existe mais nenhum lançamento de exceção pendente, isto é, a exceção que foi lançada, já foi tratada no try-catch interno do m1().
Então, apesar de o m1() ter um “throws Exception”, a execução volta para a chamada no main() mas não tem mais Exception para ser tratada, logo, nunca vai chegar na linha 6.
O que pode mudar isso é inserir um throw e2 após a linha 19 e ainda dentro do catch. Isso vai fazer com que o tratamento de exceção do m1() aconteça normalmente como já está acontecendo mas, mesmo assim, que essa Exception continue “pendente” sendo lançada ao método que chamou o m1(), o main(). Aí sim o main() vai ter que tratar essa exceção e a execução chegará à linha 6.
Vamos por partes…
Na linha 4 você chama o método m1().
Isso leva a execução diretamente à linha 14, onde você lança uma Exception genérica.
A linha 14 está dentro de um try-catch cujo catch trata justamente o tipo genérico de Exception (ou qualquer subtipo, mas não é o caso).
Aí a execução vai para a linha 17 onde o stackTrace é impresso no console e finalmente na linha 19 é impresso “m1catch”.
Nessa altura da execução não existe mais nenhum lançamento de exceção pendente, isto é, a exceção que foi lançada, já foi tratada no try-catch interno do m1().
Então, apesar de o m1() ter um “throws Exception”, a execução volta para a chamada no main() mas não tem mais Exception para ser tratada, logo, nunca vai chegar na linha 6.
O que pode mudar isso é inserir um throw e2 após a linha 19 e ainda dentro do catch. Isso vai fazer com que o tratamento de exceção do m1() aconteça normalmente como já está acontecendo mas, mesmo assim, que essa Exception continue “pendente” sendo lançada ao método que chamou o m1(), o main(). Aí sim o main() vai ter que tratar essa exceção e a execução chegará à linha 6.
Espero ter ajudado e não complicado mais!
Forte abraço![/quote]
Muito obrigado pela explicação, o que eu tinha em mente , é que quando lançada uma exceção atravez do throw, mesmo estando dentro de um bloco try catch a exceção seria tratada nao dentro do proprio método e sim quem invocou, mas , pelo jeito eu estava errado .
Muito obrigado pela explicação
att
Não esquece de editar sua primeira mensagem e alterar o título colocando [RESOLVIDO] no início.
E boa sorte nos estudos para a certificação. Faça bastante experiência com tudo o que estudar, fazendo funcionar, fazendo quebrar, fazendo funcionar diferente, aí vc vai fixar incrivelmente bem todos os conteúdos.
Não esquece de editar sua primeira mensagem e alterar o título colocando [RESOLVIDO] no início.
E boa sorte nos estudos para a certificação. Faça bastante experiência com tudo o que estudar, fazendo funcionar, fazendo quebrar, fazendo funcionar diferente, aí vc vai fixar incrivelmente bem todos os conteúdos.
Forte abraço![/quote]
Ja esta alterado, muito obrigado pela resposta e pelas dicas