Java Try Catch Finalmente bloqueia sem captura

Estou revendo um novo código. O programa tem apenas um bloco try e finally. Como o bloco catch é excluído, como o bloco try funciona se encontrar uma exceção ou qualquer coisa que possa ser lançada? Isso vai diretamente para o bloco final?

Se algum código no bloco try puder lançar uma exceção verificada, ele deverá aparecer na cláusula throws da assinatura do método. Se uma exceção não verificada for lançada, ela sairá do método.

O bloco finally é sempre executado, seja uma exceção lançada ou não.

Uma pequena nota sobre try / finally : O finalmente será sempre executado, a menos que

  • System.exit() é chamado.
  • A JVM falha.
  • O bloco try{} nunca termina (por exemplo, loop infinito).

A Especificação da Linguagem Java (1) descreve como o try-catch-finally é executado. Não ter captura é equivalente a não ter uma captura capaz de capturar o Throwable dado.

  • Se a execução do bloco try for concluída abruptamente devido a um lance de um valor V, então existe uma escolha:
    • Se o tipo de V de tempo de execução for atribuível ao parâmetro de qualquer cláusula catch da instrução try,…
    • Se o tipo de tempo de execução de V não for atribuível ao parâmetro de qualquer cláusula catch da instrução try, o bloco finally será executado . Então há uma escolha:
      • Se o bloco finally for concluído normalmente, a instrução try será concluída abruptamente devido a um lance do valor V.
      • Se o bloco finally for completado abruptamente pelo motivo S, então a instrução try será completada abruptamente pelo motivo S (e o lançamento do valor V será descartado e esquecido).

(1) Execução de try-catch-finally

O interior finalmente é executado antes de lançar a exceção ao bloco externo.

 public class TryCatchFinally { public static void main(String[] args) throws Exception { try{ System.out.println('A'); try{ System.out.println('B'); throw new Exception("threw exception in B"); } finally { System.out.println('X'); } //any code here in the first try block //is unreachable if an exception occurs in the second try block } catch(Exception e) { System.out.println('Y'); } finally { System.out.println('Z'); } } } 

Resulta em

 A B X Y Z 

O bloco finally é sempre executado depois que o bloco try termina, se a tentativa termina normalmente ou anormalmente devido a uma exceção, er, throwable.

Se uma exceção é lançada por qualquer código dentro do bloco try, então o método atual simplesmente relança (ou continua a lançar) a mesma exceção (depois de executar o bloco finally).

Se o bloco finally lançar uma exceção / erro / jogável, e já houver um lance pendente, ficará feio. Francamente, esqueço exatamente o que acontece (tanto para minha certificação anos atrás). Eu acho que ambos os throwables estão ligados, mas há algum voodoo especial que você tem que fazer (isto é, uma chamada de método que eu teria que procurar) para obter o problema original antes que o “finalmente” vomitasse, er, vomitou.

Aliás, try / finally é uma coisa bastante comum para o gerenciamento de resources, já que o java não tem destruidores.

Por exemplo –

 r = new LeakyThing(); try { useResource( r); } finally { r.release(); } // close, destroy, etc 

“Finally”, mais uma dica: se você se incomodar em colocar um catch, ou pegar subclasss específicas (esperadas), ou apenas pegar “Throwable”, não “Exception”, para uma armadilha geral de erro. Muitos problemas, como reflexões, lançam “Erros”, em vez de “Exceções”, e esses dados passam por “pegar tudo” codificados como:

 catch ( Exception e) ... // doesn't really catch *all*, eh? 

faça isso em vez disso:

 catch ( Throwable t) ... 

Versões Java antes da versão 7 permitem essas três combinações de try-catch-finally

 try - catch try - catch - finally try - finally 

finally bloco será sempre executado não importando o que está acontecendo no bloco try ou catch . então, se não houver um bloco catch , a exceção não será tratada aqui.

No entanto, você ainda precisará de um manipulador de exceção em algum lugar em seu código – a menos que você queira que seu aplicativo trave completamente, é claro. Depende da arquitetura da sua aplicação exatamente onde está esse manipulador.

  • O Java try block deve ser seguido por catch ou finally block.
  • Para cada bloco try, pode haver zero ou mais blocos catch, mas apenas um bloco final.
  • O bloco finally não será executado se o programa sair (chamando System.exit () ou causando um erro fatal que faz com que o processo seja interrompido).

como funciona o bloco try se encontrar uma exceção ou qualquer coisa que possa ser lançada

A exceção é lançada fora do bloco, assim como em qualquer outro caso em que não seja detectada.

O bloco finally é executado independentemente de como o bloco try é encerrado – independentemente de haver alguma captura, independentemente de haver uma captura correspondente.

Os blocos catch e, finalmente, são partes ortogonais do bloco try. Você pode ter um ou ambos. Com o Java 7, você não poderá ter nenhum dos dois!

Você não tenta com esse programa? Ele irá finalmente bloquear e executar o bloco finally, mas a exceção não será tratada. Mas, essa exceção pode ser anulada no bloco finally!

O bloco finally é executado depois que o bloco try é concluído. Se algo é lançado dentro do bloco try quando ele sai, o bloco finally é executado.

Intereting Posts