"Ah. Aí está você. Eu estive procurando por você."

"Aconteceu alguma coisa?"

"Não, mas ainda estamos estudando."

"OK. Estou ouvindo."

"Quero contar mais algumas coisas sobre exceções:"

"No Java 7, a construção try-catch foi ligeiramente estendida por meio da adição de vários blocos catch. Veja este exemplo:"

Java 5
try
{
  …
}
 catch (IOException ex)
{
 logger.log(ex);
 throw ex;
}
 catch (SQLException ex)
{
 logger.log(ex);
 throw ex;
}
Java 7
try
{
  …
}
 catch (IOException | SQLException ex)
{
 logger.log(ex);
 throw ex;
}

"Então agora podemos escrever várias exceções separadas por operadores OR ('|' é OR binário)?"

"Isso mesmo. Não é conveniente?"

"Hmm. Mas qual será o tipo do objeto de exceção dentro do bloco catch?"

"Afinal, uma IOException tem seus métodos e uma SQLException tem seus métodos."

"O tipo de exceção será o de sua classe ancestral comum."

"Ah. Em outras palavras, provavelmente será Exeption ou RuntimeException . Então, por que não simplesmente escrever catch(Exception e)?"

"Às vezes, ao lidar com erros individualmente, é conveniente agrupá-los, gravando alguns erros em um log, relançando outros e lidando com outros de alguma outra maneira."

"Em outras palavras, esse esquema é reconhecido como resolvendo o problema de blocos catch duplicados para lidar com erros diferentes."

"Ah. Entendi. Obrigada, Ellie."

"Isso não é tudo. Quero contar um pouco mais sobre o bloco final ."

"Como você provavelmente já sabe, este bloco é sempre executado."

"E quando digo sempre, quero dizer absolutamente sempre ."

"Por exemplo:"

Exemplo usando finalmente
try
{
 return 1;
}
 finally
{
 return 0;
}

"Aqui há um retorno no bloco try e um retorno no bloco finalmente . Portanto, o valor de retorno desse método será o número 0."

"O bloco final será executado não importa o que aconteça. E sua instrução de retorno sobrescreve o outro valor de retorno com seu próprio valor."

"Eu vejo."

"No entanto, um método pode retornar um valor ou lançar uma exceção. "

"Portanto, se um valor for retornado em um bloco try, mas o bloco final lançar uma exceção , o resultado será uma exceção . "

"E se uma exceção for lançada no bloco try , mas o bloco final tiver uma instrução return?"

"Então é como se o método funcionasse corretamente e o valor na declaração de retorno fosse retornado.

Exemplo Resultado
try
{
 return 1;
}
 finally
{
 return 0;
}
0
try
{
 return 1;
}
 finally
{
 throw new RuntimeException();
}
Exceção de tempo de execução
try
{
 throw new RuntimeException();
}
 finally
{
 return 0;
}
0
try
{
 throw new RuntimeException();
}
 finally
{
 throw new IOException();
}
IOException

"A única razão pela qual o método final pode não ser executado seria o encerramento imediato do programa por uma chamada ao método System.exit() ;."

Exemplo
try
{
 System.exit(0);
 return 1;
}
 finally
{
 return 0;
}

"Eu vejo."

"Lembre-se de que todos esses tópicos geralmente são questionados em entrevistas, por isso seria bom para você entendê-los e lembrá-los."