São um evento inesperado que interrompem o fluxo normal do programa
- Todas estendem a classe
Throwable
- Existem dois tipos Checked e Unchecked
- Checked Exceptions precisam ser capturadas ou explicitamente propagadas pelos métodos através da clausula
throws
. Normalmente representam problemas normais no fluxo do programa (e.g. um id de cliente não existir na base de dados) - Unchecked Exceptions: podem ser capturadas e não precisam ser explicitamente propagadas. Geralmente representam bugs que devem ser corrigidos (e.g. um
NullPointer
)
- Suas próprias exceções devem estender a classe
Exception
ou um descendente mais especÃfico deThrowable
- É possÃvel lançar uma exceção com o operador
throw
(e.g.throw new ProductNotFoundException()
)

- Quando uma exceção é lançada o controle do programa passa para o Exception Handler mais próximo; se um Exception Handler não existe para o método, exceções unchecked são propagadas para o invocador do método
Capturando Exceções
Quanto mais especÃfica a exceção capturada for, mais fácil identificar a causa dela
- O trecho de código que pode produzir erro deve estar no bloco de
try
- Para capturar um tipo de exceção deve-se utilizar
catch
(e.g.catch (Exception e)
) - as exceções são capturadas por ordem de especificidade, a exceção menos especÃfica deve ficar por último na sequencia de
catch
's (o compilador irá avisar caso isso seja violado) - um bloco de captura pode capturar múltiplos tipos de exceção
NullPointerException | ArithmeticException
- quanto mais especÃfica a exceção capturada for, mais fácil identificar a causa do erro

- É possÃvel definir um bloco de código que executa ao final do fluxo do bloco
try
, mesmo que uma exceção seja lançada e o bloco não seja completamente percorrido, com o blocofinally
- normalmente utilizado para liberar recursos ou encerrar algo iniciado no bloco de
try
- Ao capturar uma exceção você pode: escrever logs, lançar outra exceção, interromper a execução do restante do método ou tomar quaisquer outras medidas corretivas
- É possÃvel aninhar blocos de
try ... catch
nos blocos decatch
,finally
outry

Auto-Closure
- Utilizando a sintaxe de try-with-parameters e passando classes que implementem a interface
AutoCloseable
- A interface
AutoCloseable
possuà apenas o métodoclose()
- essa sintaxe é identificada pelo compilador que, implicitamente, cria um bloco
finally
e executa as ações necessárias para cada parâmetros passado aotry
- É possÃvel inicializar múltiplos recursos nos parâmetros do try-with-parameters

- Pode ocorrer de exceções serem escondidas devido a sintaxe de auto-closure. Se uma exceção for lançada no bloco implÃcito
finally
, não é possÃvel capturar essa exceção. É possÃvel, porém, em um blococatch
de outra exceção, ler as mensagens que foram escondidas com o métodogetSuppressed()
Â