Estou revendo um novo código. O programa tem apenas uma tentativa e, finalmente, um bloco. Como o bloco catch é excluído, como o bloco try funciona se encontrar uma exceção ou algo que possa ser jogado? Apenas vai diretamente para o bloco final?
Estou revendo um novo código. O programa tem apenas uma tentativa e, finalmente, um bloco. Como o bloco catch é excluído, como o bloco try funciona se encontrar uma exceção ou algo que possa ser jogado? Apenas vai diretamente para o bloco final?
Respostas:
Se algum código no bloco try puder gerar 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 será excluída do método.
O bloco final é sempre executado, independentemente de uma exceção ser lançada ou não.
Uma pequena nota em try
/ finally
: O finalmente sempre será executado, a menos que
System.exit()
é chamado.try{}
bloco nunca termina (por exemplo, loop sem fim).try{..} catch{ throw ..} finally{..}
? Eu acho que finalmente não será executado
A especificação da linguagem Java (1) descreve como try-catch-finally
é executada. Não ter captura é equivalente a não ter uma captura capaz de pegar o Throwable fornecido.
- Se a execução do bloco try for concluída abruptamente devido a um lançamento de um valor V, haverá uma opção:
- Se o tipo de tempo de execução de V for atribuível ao parâmetro de qualquer cláusula catch da instrução try, então
……- 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 final será executado . Depois, há uma escolha:
- Se o bloco finalmente for concluído normalmente, a instrução try será concluída abruptamente devido a um lançamento do valor V.
- Se o bloco final for concluído abruptamente pelo motivo S, a instrução try será concluída abruptamente pelo motivo S (e o lançamento do valor V será descartado e esquecido).
O interior finalmente é executado antes de lançar a exceção no 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 final é sempre executado após o término do bloco try, se a tentativa termina normalmente ou de forma anormal devido a uma exceção, er, lançável.
Se uma exceção é lançada por qualquer código dentro do bloco try, o método atual simplesmente lança novamente (ou continua a lançar) a mesma exceção (depois de executar o bloco finally).
Se o bloco final lança uma exceção / erro / lança, e já existe um lançamento pendente, fica feio. Francamente, esqueço exatamente o que acontece (tanto pela minha certificação anos atrás). Acho que os dois lançadores ficam interligados, mas há um vodu especial que você precisa fazer (ou seja, - uma chamada de método que eu precisaria procurar) para obter o problema original antes que o "finalmente" vomite, er, vomite.
Aliás, try / finalmente é uma coisa bastante comum a ser feita no gerenciamento de recursos, pois o java não possui destruidores.
Por exemplo -
r = new LeakyThing();
try { useResource( r); }
finally { r.release(); } // close, destroy, etc
"Finalmente", mais uma dica: se você não se preocupam em colocar em um prendedor, ou captura específica (esperado) subclasses throwable, ou apenas pegar "Throwable", não "Exception", para um catch-all interceptação de erro geral. Muitos problemas, como as reflexões, geram "Erros", em vez de "Exceções", e esses erros serão corrigidos por qualquer "pegar tudo" codificado como:
catch ( Exception e) ... // doesn't really catch *all*, eh?
faça isso:
catch ( Throwable t) ...
As versões Java anteriores à versão 7 permitem essas três combinações de try-catch-finalmente ...
try - catch
try - catch - finally
try - finally
finally
O bloco será sempre executado independentemente do que estiver acontecendo no try
catch
bloco ou / e . portanto, se não houver catch
bloqueio, a exceção não será tratada aqui.
No entanto, você ainda precisará de um manipulador de exceções em algum lugar do seu código - a menos que queira que seu aplicativo trave completamente, é claro. Depende da arquitetura do seu aplicativo exatamente onde está o manipulador.
- O bloco try de Java deve ser seguido pelo bloco catch ou finalmente.
- Para cada bloco try, pode haver zero ou mais blocos catch, mas apenas um bloco finalmente.
- O bloco final não será executado se o programa sair (chamando System.exit () ou causando um erro fatal que causa a interrupção do processo).
como o bloco try funciona se encontrar uma exceção ou algo que possa ser jogado
A exceção é lançada para fora do bloco, como em qualquer outro caso em que não é capturada.
O bloco final é executado independentemente de como o bloco try foi 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!
Você não tenta com esse programa? Irá finalmente bloquear e executar o bloco finalmente, mas a exceção não será tratada. Mas, essa exceção pode ser anulada no bloco finalmente!
Dentro do try
bloco, escrevemos códigos que podem gerar uma exceção. O catch
bloco é onde lidamos com a exceção. O finally
bloco é sempre executado, independentemente de ocorrer ou não uma exceção.
Agora, se tivermos o bloco try-finalmente em vez do bloco try-catch-finalmente, a exceção não será tratada e, após o bloco try, em vez de o controle pegar o bloco, ele irá finalmente bloquear. Podemos usar o bloco try-finally quando queremos fazer nada com a exceção.