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
Exceptionou 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 ... catchnos blocos decatch,finallyoutry

Auto-Closure
- Utilizando a sintaxe de try-with-parameters e passando classes que implementem a interface
AutoCloseable - A interface
AutoCloseablepossuà apenas o métodoclose() - essa sintaxe é identificada pelo compilador que, implicitamente, cria um bloco
finallye 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 blococatchde outra exceção, ler as mensagens que foram escondidas com o métodogetSuppressed()
Â