Exceção Verificada vs Exceção em Tempo de Execução
Exceções são tipos especiais de eventos, que podem perturbar o fluxo normal do programa. O nome exceção vem de “evento excepcional”. Lançar uma exceção é o processo de criar um objeto de exceção e entregá-lo ao sistema de tempo de execução. Quando o sistema de tempo de execução recebe o objeto de exceção, ele tentará encontrar alguém para tratá-lo dentro da pilha de chamadas percorrendo-o na ordem inversa (na qual os métodos foram chamados). O sistema de tempo de execução é bem-sucedido se encontrar um método com um manipulador de exceção. O manipulador de exceção é um bloco de código que pode manipular oficialmente a referida exceção. Se o sistema de tempo de execução encontrar um manipulador apropriado, ele passará o objeto de exceção para o manipulador. Isso é chamado de captura da exceção. No entanto, se a exceção não puder ser tratada, o programa será encerrado. Em Java, as exceções herdam da classe Throwable. Exceções verificadas são exceções nas quais a manipulação é imposta pelo compilador. Exceções de tempo de execução são um tipo de exceção, que não é verificada pelo compilador.
O que é uma exceção verificada?
Exceções marcadas são objetos da classe java.lang.exception ou suas subclasses (exceto a java.lang. RuntimeException e suas subclasses). As exceções verificadas são “verificadas” em tempo de compilação. Isso significa que o programador deve capturar ou lançar essas exceções, ou então a compilação reclamaria (causando um erro do compilador). Por esse motivo, muitas exceções verificadas são bem conhecidas dos programadores. Por exemplo, a IOException e suas subclasses são exceções verificadas, e sempre que o programador está lidando com o acesso ou modificação de um arquivo, o compilador verifica se todas as IOExceptions possíveis são atendidas pelo programador.
O que é uma exceção de tempo de execução?
Runtime Exceptions consistem em java.lang. RuntimeException e todas as suas subclasses. Teoricamente falando, elas servem ao mesmo propósito que as exceções verificadas e podem ser lançadas ou tratadas como exceção verificada, mas o tratamento delas não é imposto pelo compilador. Portanto, as exceções de tempo de execução pertencem à família de exceções não verificadas. NullPointerException, NumberFormatEception, ClassCastException e ArrayIndexOutOfBoundsException são exceções comuns de tempo de execução em Java.
Qual é a diferença entre Checked Exception e Runtime Exception?
Embora tanto as exceções verificadas quanto as exceções de tempo de execução sejam ocorrências indesejadas durante a execução de um programa, elas têm suas diferenças. A manipulação de exceção verificada é imposta pelo compilador, mas as exceções de tempo de execução não. Portanto, as exceções verificadas devem ser lançadas ou tratadas para que o código seja compilado, mas não há esse requisito em relação às exceções de tempo de execução. Consequentemente, as exceções de tempo de execução pertencem à categoria de exceções não verificadas junto com os erros.
Desvantagem com exceções verificadas é que o programador tem que lidar com isso mesmo que não saiba como. Portanto, se o programador apenas lançar uma nova exceção sem envolver a original, o rastreamento de pilha pertencente à exceção original será perdido. É aqui que as exceções de tempo de execução são úteis. Como todas as exceções de tempo de execução podem ser tratadas em um único local, os programadores podem escrever menos quantidade de código. Por outro lado, como as exceções verificadas devem ser capturadas, não há surpresa para o programador. Ela sempre saberá qual exceção verificada pode ser lançada por um determinado método. Ao contrário disso, várias exceções de tempo de execução podem ser lançadas sem o conhecimento do programador.