Estou tentando aprender mais sobre Java básico e os diferentes tipos de Throwables. Alguém pode me informar sobre as diferenças entre exceções e erros?
Estou tentando aprender mais sobre Java básico e os diferentes tipos de Throwables. Alguém pode me informar sobre as diferenças entre exceções e erros?
Respostas:
Os erros não devem ser detectados ou manipulados (exceto nos casos mais raros). As exceções são o pão e a manteiga do tratamento de exceções. O Javadoc explica bem:
Um erro é uma subclasse de Throwable que indica problemas sérios que um aplicativo razoável não deve tentar capturar. A maioria desses erros são condições anormais.
Veja algumas das subclasses de Error
, tomando alguns de seus comentários do JavaDoc:
AnnotationFormatError
- Lançada quando o analisador de anotação tenta ler uma anotação de um arquivo de classe e determina que a anotação está malformada.AssertionError
- Lançado para indicar que uma asserção falhou.LinkageError
- Subclasses de LinkageError indicam que uma classe tem alguma dependência de outra classe; no entanto, a última classe mudou de forma incompatível após a compilação da classe anterior.VirtualMachineError
- Lançada para indicar que a Java Virtual Machine está com defeito ou ficou sem recursos necessários para continuar operando. Existem realmente três subcategorias importantes de Throwable
:
Error
- Algo grave o suficiente deu errado, a maioria dos aplicativos deve travar em vez de tentar resolver o problema,RuntimeException
) - Muitas vezes, um erro de programação, como um NullPointerException
argumento ilegal ou. Às vezes, os aplicativos podem manipular ou recuperar dessa Throwable
categoria - ou pelo menos capturá-la no run()
método do Thread , registrar a reclamação e continuar executando.FileNotFoundException
e TimeoutException
...Este slide que mostra a hierarquia de exceção do Java por @ georgios-gousios explica concisamente as diferenças entre Erros e Exceções em Java.
Os erros tendem a sinalizar o final do seu aplicativo como você o conhece. Normalmente não pode ser recuperado e deve fazer com que sua VM saia. A captura não deve ser feita, exceto para registrar ou exibir a mensagem apropriada antes de sair.
Exemplo: OutOfMemoryError - Não há muito o que fazer, pois seu programa não pode mais ser executado.
As exceções geralmente são recuperáveis e, mesmo quando não são, geralmente significam que uma tentativa de operação falhou, mas seu programa ainda pode continuar.
Exemplo: IllegalArgumentException - Passou dados inválidos para um método, para que a chamada do método falhou, mas isso não afeta operações futuras.
Estes são exemplos simplistas, e há outra riqueza de informações apenas sobre exceções.
Erros -
Error
s em Java são do tipo java.lang.Error
.Error
s acontecem em tempo de execução. Eles não serão conhecidos pelo compilador. Error
s são causados principalmente pelo ambiente em que o aplicativo está sendo executado. java.lang.StackOverflowError
,java.lang.OutOfMemoryError
Exceções -
Exception
s em Java são do tipo java.lang.Exception
.Exception
s incluem os tipos marcado e não marcado.try-catch
blocos.Exception
s são causados principalmente pelo próprio aplicativo.SQLException
, IOException
ArrayIndexOutOfBoundException
, ClassCastException
,NullPointerException
leitura adicional: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
A Sun coloca da melhor maneira :
Um erro é uma subclasse de Throwable que indica problemas sérios que um aplicativo razoável não deve tentar capturar.
A descrição da Error
classe é bastante clara:
An
Error
é uma subclasseThrowable
que indica problemas sérios que um aplicativo razoável não deve tentar capturar. A maioria desses erros são condições anormais. OThreadDeath
erro, embora seja uma condição "normal", também é uma subclasseError
porque a maioria dos aplicativos não deve tentar capturá-lo.Não é necessário que um método declare em sua cláusula throws quaisquer subclasses
Error
que possam ser lançadas durante a execução do método, mas não capturadas, pois esses erros são condições anormais que nunca devem ocorrer.
Citado da própria documentação da classe emError
Java .
Em resumo, você não deve pegar Error
s, exceto que você tem um bom motivo para fazê-lo. (Por exemplo, para impedir que sua implementação do servidor da web falhe, se um servlet ficar sem memória ou algo assim.)
Um Exception
, por outro lado, é apenas uma exceção normal, como em qualquer outra língua moderna. Você encontrará uma descrição detalhada na documentação da API Java ou em qualquer recurso online ou offline.
Existem várias semelhanças e diferenças entre classes java.lang.Exception
e java.lang.Error
.
Semelhanças:
Primeiro - ambas as classes estende java.lang.Throwable
e, como resultado herda muitos dos métodos que são comuns a ser usado quando se lida com os erros, tais como: getMessage
, getStackTrace
, printStackTrace
e assim por diante.
Segundo, como subclasses das java.lang.Throwable
duas herdam as seguintes propriedades:
A própria jogável e qualquer uma de suas subclasses (inclusive java.lang.Error
) podem ser declaradas na lista de exceções de método usando a throws
palavra-chave Tal declaração exigida apenas para java.lang.Exception
e subclasses, por java.lang.Throwable
, java.lang.Error
e java.lang.RuntimeException
e suas subclasses é opcional.
Somente java.lang.Throwable
e subclasses podem ser usadas na catch
cláusula.
Somente java.lang.Throwable
e subclasses podem ser usadas com a palavra-chave - throw
.
A conclusão a partir desta propriedade está seguindo ambos java.lang.Error
e java.lang.Exception
pode ser declarada no cabeçalho do método, pode ser em catch
cláusula, pode ser usado com palavra-chave throw
.
Diferenças:
Primeira - diferença conceitual: java.lang.Error
projetada para ser lançada pela JVM e indicar problemas sérios e destinada a interromper a execução do programa em vez de ser capturada (mas é possível como para qualquer outro java.lang.Throwable
sucessor).
Uma passagem da descrição do javadoc sobre java.lang.Error
:
... indica problemas sérios que um aplicativo razoável não deve tentar capturar.
Por outro lado, java.lang.Exception
projetado para representar os erros esperados e que podem ser tratados por um programador sem interromper a execução do programa.
Uma passagem da descrição do javadoc sobre java.lang.Exception
:
... indica as condições que um aplicativo razoável pode querer capturar.
java.lang.Error
e java.lang.Exception
a primeira considerada uma exceção desmarcada para verificação de exceção em tempo de compilação. Como o código de resultado lançado java.lang.Error
ou suas subclasses não requer que esse erro seja declarado no cabeçalho do método. Ao lançar a java.lang.Exception
declaração necessária no cabeçalho do método.Throwable e seu diagrama de classes sucessora (propriedades e métodos são omitidos).
Um erro da IMO é algo que pode causar falha no seu aplicativo e não deve ser tratado. Uma exceção é algo que pode causar resultados imprevisíveis, mas pode ser recuperado.
Exemplo:
Se um programa ficou sem memória, é um erro, pois o aplicativo não pode continuar. No entanto, se um programa aceita um tipo de entrada incorreto, é uma exceção, pois o programa pode manipulá-lo e redirecioná-lo para receber o tipo de entrada correto.
Os erros são causados principalmente pelo ambiente em que o aplicativo está sendo executado. Por exemplo, OutOfMemoryError ocorre quando a JVM fica sem memória ou StackOverflowError ocorre quando a pilha está cheia.
As exceções são causadas principalmente pelo próprio aplicativo. Por exemplo, NullPointerException ocorre quando um aplicativo tenta acessar um objeto nulo ou ClassCastException ocorre quando um aplicativo tenta converter tipos de classe incompatíveis.
Aqui está um resumo muito bom da API Java que um Error and Exception representa:
Um erro é uma subclasse de Throwable que indica problemas sérios que um aplicativo razoável não deve tentar capturar. A maioria desses erros são condições anormais. O erro ThreadDeath, embora seja uma condição "normal", também é uma subclasse de Error, porque a maioria dos aplicativos não deve tentar capturá-lo.
Não é necessário que um método declare em sua cláusula throws quaisquer subclasses de Error que possam ser lançadas durante a execução do método, mas não capturadas, pois esses erros são condições anormais que nunca devem ocorrer.
OTOH, para exceções, a API Java diz:
A classe Exception e suas subclasses são uma forma de Throwable que indica condições que um aplicativo razoável pode querer capturar.
Os erros são causados pelo ambiente em que seu aplicativo ou programa é executado. Na maioria das vezes, você não pode se recuperar dele, pois isso encerra seu aplicativo ou programa. Javadoc avisou que você não deve se incomodar em capturar esses erros, pois o ambiente, por exemplo, a JVM, encerra esses erros de qualquer maneira.
Exemplos:
VirtualMachineError
- Lançada para indicar que a Java Virtual Machine está com defeito ou ficou sem recursos necessários para continuar operando.
OutOfMemoryError
ocorre quando a JVM fica sem memória ou
StackOverflowError
ocorre quando a pilha acaba.
Exceções são causadas pelo seu aplicativo ou programa; talvez devido ao seu próprio erro. Na maioria das vezes você pode se recuperar dele e seu aplicativo continuará sendo executado. Aconselha-se a detectar esses erros para impedir o encerramento anormal do seu aplicativo ou programa e / ou para personalizar a mensagem de exceção para que os usuários vejam uma mensagem bem formatada em vez das mensagens de exceção feias padrão espalhadas por todo o lugar.
Exemplos:
NullPointerException
ocorre quando um aplicativo tenta acessar um objeto nulo. ou Tentando acessar uma matriz com um índice inexistente ou chamando uma função com dados ou parâmetros incorretos.
Unchecked exceptions != RuntimeExceptions
;Unchecked exceptions = RuntimeExceptions + Errors
. Eu sei que isso levanta a questão: o erro é uma exceção? , mas é isso que eles escrevem. Aqui está apenas um desses exemplos: docs.oracle.com/javase/tutorial/essential/exceptions/… .