[RESOLVIDO]Throw dentro de try catch

4 respostas
T
Quando possuo um código como este
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");
        }
    }

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 !

4 Respostas

A

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!

T

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!

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

A

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!

T

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!

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

Abraço!

Criado 6 de maio de 2012
Ultima resposta 7 de mai. de 2012
Respostas 4
Participantes 2