Diferenças entre exceção e erro
Pergunta
Eu estou tentando aprender mais sobre Java básico e os diferentes tipos de Throwables, alguém pode me deixar saber as diferenças entre exceções e erros?
Solução
Os erros não devem ser capturados ou manipulados (exceto em raríssimos casos). As exceções são o pão ea manteiga de manipulação de exceção. A Javadoc explica muito bem:
Um erro é uma subclasse de Throwable que indica sérios problemas que uma aplicação razoável não deve tentar captura. A maioria desses erros são anormais condições.
olhada em algumas das subclasses de Error
, tendo alguns dos seus comentários JavaDoc:
-
AnnotationFormatError
-. Lançada quando as tentativas do analisador anotação para ler uma anotação de um arquivo de classe e determina que a anotação está mal formado -
AssertionError
-. Lançado para indicar que uma afirmação falhou -
LinkageError
- As subclasses de LinkageError indicar que uma classe tem alguma dependência em outra classe; No entanto, a última classe tem incompatibly alterado após a compilação da classe anterior. -
VirtualMachineError
- Lançado para indicar que a Máquina Virtual Java está quebrado ou ficou sem recursos necessários para que possa continuar operando.
Há realmente três subcategorias importantes de Throwable
:
-
Error
- Algo bastante grave tem errado ido a maioria das aplicações deve falhar em vez de tentar lidar com o problema, - exceção não verificada (aka
RuntimeException
) - Muitas vezes, um erro de programação, tais comoNullPointerException
ou um argumento ilegal. Aplicações às vezes pode lidar ou recuperar a partir desta categoriaThrowable
-. Ou pelo menos pegá-lo no métodorun()
da Thread, registrar a queixa, e continuar a executar - Excepção verificado (aka Tudo o resto) - As candidaturas são esperados para ser capaz de capturar e significativamente fazer algo com o resto, como
FileNotFoundException
eTimeoutException
...
Outras dicas
Esta href="https://speakerdeck.com/gousiosg/exception-handling-bug-hazards-on-android?slide=8" rel="noreferrer"> slides de Java por @ georgios-gousios concisa explica as diferenças entre erros e exceções em Java.
Os erros tendem a sinalizar o fim da sua aplicação como você sabe disso. Ele normalmente não podem ser recuperados a partir e deve fazer com que seu VM para sair. Pegá-los não deve ser feito a não ser para possivelmente iniciar sessão ou exibição e mensagem apropriada antes de sair.
As exceções são muitas vezes recuperável e mesmo quando não, eles geralmente significa apenas uma tentativa de operação falhou, mas o programa ainda pode continuar.
Estes são exemplos simplistas, e não há outra riqueza de informações sobre apenas Exceções sozinho.
Um erro é uma subclasse de Throwable que indica sérios problemas que uma aplicação razoável não deve tentar a captura.
Erros -
-
Error
s em java são do tipojava.lang.Error
. - Todos os erros em java são do tipo desmarcada.
-
Error
s acontecer em tempo de execução. Eles não serão conhecidos por compilador. - É impossível recuperar de erros.
-
Error
s são principalmente causadas pelo ambiente em que a aplicação está em execução. - Exemplos:
java.lang.StackOverflowError
,java.lang.OutOfMemoryError
Exceções -
-
Exception
s em java são do tipojava.lang.Exception
. -
Exception
s incluir tanto verificada assim como o tipo desmarcada. - As exceções verificadas são conhecidos por compilador onde como exceções não verificadas não são conhecidos por compilador porque eles ocorrem em tempo de execução.
- Você pode se recuperar de exceções manuseá-los através de blocos
try-catch
. -
Exception
s são causadas principalmente pela própria aplicação. - Exemplos: exceções verificadas:
SQLException
,IOException
Exceções não verificadas:ArrayIndexOutOfBoundException
,ClassCastException
,NullPointerException
outras leituras: http://javaconceptoftheday.com/difference- entre-erro-vs-excepção-em-java /
A descrição da classe Error
é bastante clara:
Um
Error
é uma subclasse deThrowable
que indica sérios problemas que uma aplicação razoável não deve tentar pegar. A maioria desses erros são condições anormais. oThreadDeath
erro, embora uma condição "normal", é também uma subclasse deError
porque a maioria aplicações não devem tentar pegar -lo.Um método não é obrigado a declarar em sua cláusula throws quaisquer subclasses de
Error
que pode ser jogado durante o execução do método, mas não capturados, uma vez que estes erros são condições anormais que nunca deveria ocorrer.
Citado dos próprios do Error
classe .
Em suma, você não deve pegar Error
s, exceto que você tem uma boa razão para fazê-lo. (Por exemplo, para evitar a sua implementação do servidor web para acidente se um servlet é executado fora de memória ou algo parecido.)
Um Exception
, por outro lado, é apenas uma exceção normal, como em qualquer outra língua moderna. Você vai encontrar uma descrição detalhada na documentação da API Java ou qualquer recurso on-line ou off-line.
Há várias semelhanças e diferenças entre as 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 erros, tais como:getMessage
,getStackTrace
,printStackTrace
e assim por diante. -
Em segundo lugar, como sendo subclasses de
java.lang.Throwable
ambos herdam seguintes propriedades:-
si mesmo e qualquer uma de suas subclasses (incluindo
java.lang.Error
) Throwable podem ser declarados na lista de exceções do método usando a palavra chavethrows
. Tal declaração exigida apenas parajava.lang.Exception
e subclasses, porjava.lang.Throwable
,java.lang.Error
ejava.lang.RuntimeException
e suas subclasses é opcional. -
Apenas
java.lang.Throwable
e subclasses permissão para ser usado na cláusulacatch
. -
Apenas
java.lang.Throwable
e subclasses pode ser usado com palavra-chave -.throw
-
A conclusão a partir desta propriedade está seguindo ambos java.lang.Error
e java.lang.Exception
pode ser declarado no cabeçalho do método, pode ser na cláusula catch
, pode ser usado com throw
palavra-chave.
Diferenças:
-
Primeiro - diferença conceitual:
java.lang.Error
projetado para ser atirados pela JVM e indicam problemas graves e destinados à paragem a execução do programa, em vez de ser pego (mas é possível que para qualquer outro sucessorjava.lang.Throwable
).A passagem de javadoc descrição sobre
java.lang.Error
:... indica sérios problemas que uma aplicação razoável deve não tentar captura.
Em
java.lang.Exception
oposto projetado para representam os erros esperado e pode ser manuseado por um programador sem terminar execução do programa.A passagem de javadoc descrição sobre
java.lang.Exception
:... indica condições que uma aplicação razoável pode querer captura.
- A segunda diferença entre
java.lang.Error
ejava.lang.Exception
que o primeiro considerado um desmarcada exceção para verificação de exceção em tempo de compilação. Como o lançamentojava.lang.Error
código de resultado ou de suas subclasses não precisam declarar esse erro no cabeçalho do método. Enquanto jogandojava.lang.Exception
requerida declaração no cabeçalho do método.
Throwable e sua classe sucessor diagrama (propriedades e métodos são omitidos).
IMO um erro é algo que pode causar o aplicativo a falhar e não deve ser tratada. Uma exceção é algo que pode causar resultados imprevisíveis, mas podem ser recuperados.
Exemplo:
Se um programa foi executado sem memória é um erro que o aplicativo não pode continuar. No entanto, se um programa aceita um tipo de entrada incorreta é uma exceção como o programa pode lidar com isso e redirecionar para receber o tipo de entrada correta.
Aqui está um resumo bom bastante de API Java que um erro e de exceção representa:
Um erro é uma subclasse de Throwable que indica problemas sérios que uma aplicação razoável não deve tentar captura. A maioria desses erros são condições anormais. O erro ThreadDeath, embora uma condição "normal", é também uma subclasse de erro porque a maioria das aplicações não deve tentar pegá-lo.
Um método não é obrigado a declarar em sua cláusula throws quaisquer subclasses de De erro que pode ser jogado durante o execução do método, mas não capturados, uma vez que estes erros são condições anormais que nunca deveria ocorrer.
OTOH, para Exceções, API Java diz:
A classe Exception e suas subclasses são uma forma de Throwable que indica condições que uma aplicação razoável pode querer captura.
Os erros são causados ??principalmente pelo ambiente em que a aplicação está em execução. Por exemplo, OutOfMemoryError ocorre quando JVM ficar sem memória ou StackOverflowError ocorre quando a pilha transborda.
As excepções são causadas principalmente pela própria aplicação. Por exemplo, NullPointerException ocorre quando uma aplicação tenta objeto de acesso nulo ou ClassCastException ocorre quando um tentativas de aplicação para lançar tipos de classe incompatíveis.