[RESOLVIDO]Throw dentro de try catch

Quando possuo um código como este

[code]public static void main(String[] args)
{
try {
m1();
} catch (Exception ex) {
ex.printStackTrace();
System.out.println(“Except”);
}
}

static void m1() throws Exception {
    try
    {
        throw new Exception();
    }catch(Exception e2)
    {
        e2.printStackTrace();
        
        System.out.println("m1catch");
    }
}[/code]

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 !

Ae tioola,

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

Forte abraço!

[quote=adornes]Ae tioola,

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

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

Valeu, tioola!

Fico feliz de ter ajudado!

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. :wink:

Forte abraço!

[quote=adornes]Valeu, tioola!

Fico feliz de ter ajudado!

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. :wink:

Forte abraço![/quote]

Ja esta alterado, muito obrigado pela resposta e pelas dicas :wink:

Abraço!