Checked Exceptions são poderosas porque permitem que você force o site de uso a lidar com um caso excepcional. Se o site de uso não lidar com um caso excepcional (ou anunciar publicamente que não está lidando com ele), o código falhará na compilação.
No entanto, isso é tempo de compilação. E quanto ao Runtime?
Há alguma diferença significativa entre exceções verificadas e não verificadas em tempo de execução?
A única coisa que consigo pensar é que as Exceções Não Verificadas estendem RuntimeException
, mas não vejo nenhuma propriedade RuntimeException
que permita que elas sejam tratadas de forma diferente em TEMPO DE EXECUÇÃO.
Exceções verificadas são um recurso da linguagem Java e são impostas apenas pelo compilador. Elas não são impostas pela máquina virtual Java de forma alguma.
A
throws
cláusula ainda é registrada em um arquivo de classe compilado para fins de programação em uma biblioteca compilada. Mas ao descrever o significado dos dados, a especificação da JVM observa que:Com algum abuso de genéricos, você pode enganar o compilador para lançar qualquer exceção que você quiser, de onde você quiser:
Saída:
Além disso, o método de reflexão
Class.newInstance()
está obsoleto porque, devido a uma falha de design, ele lança novamente qualquer exceção verificada lançada pelo construtor da classe, sem encapsulá-la ou declará-la:Não acho que a JVM faça distinção entre eles. A declaração try-with-resources, por exemplo, na verdade cria uma declaração throw Throwable pelo compilador Java.