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?
173
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
...
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/… .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.
fonte
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.
fonte
Erros -
Error
s em Java são do tipojava.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 tipojava.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
Excepções não marcados:
ArrayIndexOutOfBoundException
,ClassCastException
,NullPointerException
leitura adicional: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
fonte
A Sun coloca da melhor maneira :
fonte
A descrição da
Error
classe é bastante clara:Citado da própria documentação da classe em
Error
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.fonte
Existem várias semelhanças e diferenças entre classes
java.lang.Exception
ejava.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 athrows
palavra-chave Tal declaração exigida apenas parajava.lang.Exception
e subclasses, porjava.lang.Throwable
,java.lang.Error
ejava.lang.RuntimeException
e suas subclasses é opcional.Somente
java.lang.Throwable
e subclasses podem ser usadas nacatch
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
ejava.lang.Exception
pode ser declarada no cabeçalho do método, pode ser emcatch
cláusula, pode ser usado com palavra-chavethrow
.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 outrojava.lang.Throwable
sucessor).Uma passagem da descrição do javadoc sobre
java.lang.Error
: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
:java.lang.Error
ejava.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çadojava.lang.Error
ou suas subclasses não requer que esse erro seja declarado no cabeçalho do método. Ao lançar ajava.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).
fonte
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.
fonte
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.
Fonte: Diferença entre erro versus exceção em Java
fonte
Aqui está um resumo muito bom da API Java que um Error and Exception representa:
OTOH, para exceções, a API Java diz:
fonte
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 ouStackOverflowError
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.fonte