Alguém, por favor, explique a diferença entre java.lang.RuntimeException
e java.lang.Exception
? Como decido qual deles estender se eu criar minha própria exceção?
210
Geralmente RuntimeExceptions são exceções que podem ser evitadas por meio de programação. Por exemplo NullPointerException
, ArrayIndexOutOfBoundException
. Se você procurar null
antes de chamar qualquer método, NullPointerException
isso nunca ocorrerá. Da mesma forma ArrayIndexOutOfBoundException
, nunca ocorreria se você verificar o índice primeiro. RuntimeException
não são verificados pelo compilador, portanto, é um código limpo.
Edição : Hoje em dia as pessoas favorecem RuntimeException
porque o código limpo que produz. É uma escolha totalmente pessoal.
RuntimeException
é porque é simples e evita a necessidade de pensar nas diferenças entre exceções verificadas e não verificadas. Eu acho que pegar exceções de tempo de execução é uma péssima idéia, porque você vai pegar exceções irrecuperáveis, comoNullPointerException
.Em Java, existem dois tipos de exceções: exceções verificadas e exceções não verificadas. Uma exceção verificada deve ser tratada explicitamente pelo código, enquanto que uma exceção não verificada não precisa ser explicitamente tratada.
Para exceções verificadas, é necessário colocar um bloco try / catch em torno do código que poderia gerar a exceção ou adicionar uma cláusula "throws" ao método, para indicar que o método pode lançar esse tipo de exceção (que deve ser manipulados na classe de chamada ou acima).
Qualquer exceção que deriva de "Exception" é uma exceção verificada, enquanto uma classe que deriva de RuntimeException é desmarcada. RuntimeExceptions não precisa ser explicitamente tratado pelo código de chamada.
fonte
Antes de observar a diferença entre
java.lang.RuntimeException
ejava.lang.Exception
classes, você deve conhecer aException
hierarquia. As classesException
eError
são derivadas da classeThrowable
(que deriva da classeObject
). E a classeRuntimeException
é derivada da classeException
.Todas as exceções são derivadas de
Exception
ouRuntimeException
.Todas as exceções derivadas
RuntimeException
são chamadas de exceções não verificadas . E todas as outras exceções são exceções verificadas . Uma exceção verificada deve ser capturada em algum lugar do seu código, caso contrário, ela não será compilada. É por isso que eles são chamados de exceções verificadas. Por outro lado, com exceções não verificadas, o método de chamada não tem obrigação de manipular ou declarar.Portanto, todas as exceções que o compilador obriga a manipular são derivadas diretamente
java.lang.Exception
e todas as outras que o compilador não obriga a manipular são derivadasjava.lang.RuntimeException
.A seguir, estão algumas das subclasses conhecidas diretas de RuntimeException .
fonte
Uma exceção está marcada e uma RuntimeException está desmarcada.
Verificado significa que o compilador exige que você lide com a exceção em uma captura ou declare seu método como lançá-la (ou uma de suas superclasses).
Geralmente, lance uma exceção verificada se o responsável pela chamada da API lidar com a exceção e uma exceção desmarcada se for algo que o responsável pela chamada normalmente não seria capaz de lidar, como um erro em um dos parâmetros, ou seja, uma programação erro.
fonte
As classes de exceção de tempo de execução (RuntimeException e suas subclasses) estão isentas da verificação em tempo de compilação, pois o compilador não pode estabelecer que exceções em tempo de execução não possam ocorrer. (de JLS).
Nas classes projetadas, você deve subclassar Exception e lançar instâncias para sinalizar quaisquer cenários excepcionais. Ao fazer isso, você estará sinalizando explicitamente aos clientes da sua classe que o uso da sua classe pode gerar uma exceção e eles precisam tomar medidas para lidar com esses cenários excepcionais.
Os trechos de código abaixo explicam este ponto:
Na definição de classe acima da classe Process , o método
execute
pode lançar uma RuntimeException, mas a declaração do método não precisa especificar que ela lança RuntimeException .O método
process
lança uma exceção verificada e deve declarar que lançará uma exceção verificada do tipo MyException e, caso contrário, será um erro de compilação.A definição de classe acima afetará o código que também usa a classe Process .
A chamada
new Process().execute()
é uma chamada válida, na qual, como a chamada do formulárionew Process().process()
gera um erro de compilação. Isso ocorre porque o código do cliente deve executar etapas para manipularMyException
(digamos, chamada para process () pode ser incluída em um bloco try / catch).fonte
Uso adequado de RuntimeException?
Das exceções não verificadas - a controvérsia :
Observe que uma exceção não marcada é uma derivada
RuntimeException
e uma exceção verificada é uma derivadaException
.Por que lançar um
RuntimeException
se um cliente não pode fazer nada para se recuperar da exceção? O artigo explica:fonte
Da documentação do oracle:
As exceções de tempo de execução representam problemas resultantes de um problema de programação e, como tal, não é de esperar que o código do cliente da API se recupere deles ou os manipule de qualquer maneira.
RuntimeExceptions são como "exceções pelo uso inválido de uma API" exemplos de exceções de execução: IllegalStateException, NegativeArraySizeException, NullpointerException
Com as exceções, você deve capturá-lo explicitamente porque ainda pode fazer algo para se recuperar. Exemplos de exceções são: IOException, TimeoutException, PrintException ...
fonte
Em palavras simples, se seu cliente / usuário puder se recuperar da Exceção, torne-a uma Exceção Verificada , se seu cliente não puder fazer nada para se recuperar da Exceção, faça-o como Desmarcado RuntimeException . Por exemplo, uma RuntimeException seria um erro programático, como divisão por zero, nenhum usuário pode fazer nada a não ser o próprio programador, então é uma RuntimeException .
fonte
RuntimeException é uma classe filho da classe Exception
Essa é uma das muitas classes filho da classe Exception. RuntimeException é a superclasse dessas exceções que podem ser lançadas durante a operação normal da Java Virtual Machine. Não é necessário que um método declare em sua cláusula throws quaisquer subclasses de RuntimeException que possam ser lançadas durante a execução do método, mas não capturadas.
A hierarquia é
java.lang.Object
--- java.lang.Throwable
------- java.lang.Exception
------------- java.lang.RuntimeException
fonte
As exceções são uma boa maneira de lidar com eventos inesperados no fluxo do aplicativo. RuntimeException não está marcado pelo Compilador, mas você pode preferir usar Exceções que estendem a Classe de Exceção para controlar o comportamento de seus clientes API, pois são necessários para detectar erros para compilação. Também forma uma boa documentação.
Se desejar obter uma interface limpa, use herança para subclassificar os diferentes tipos de exceção que seu aplicativo possui e, em seguida, exponha a exceção pai.
fonte
Existem dois tipos de exceção: você pode se recuperar da exceção verificada se receber esse tipo de exceção. Exceções de tempo de execução são irrecuperáveis, exceções de tempo de execução são erros de programação, e o programador deve cuidar disso enquanto escreve o código, e continuar a execução disso pode resultar em resultados incorretos. As exceções de tempo de execução são sobre violar a pré-condição ex. você tem uma matriz de tamanho 10 e está tentando acessar o 11º elemento, ele lançará ArrayIndexOutOfBoundException
fonte
A exceção definida pelo usuário pode ser exceção verificada ou exceção não verificada, depende da classe para a qual está estendendo.
A exceção definida pelo usuário pode ser uma exceção verificada personalizada, se estiver estendendo para a classe Exception
Exceção definida pelo usuário pode ser Exceção não verificada personalizada, se estiver estendendo para a classe Exceção de tempo de execução.
Defina uma classe e torne-a filha de Exception ou Run time Exception
fonte