Diferenças entre exceção e erro

173

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?

Marco Leung
fonte

Respostas:

178

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,
  • Exceção não verificada (aka RuntimeException) - Muitas vezes, um erro de programação, como um NullPointerExceptionargumento ilegal ou. Às vezes, os aplicativos podem manipular ou recuperar dessa Throwablecategoria - ou pelo menos capturá-la no run()método do Thread , registrar a reclamação e continuar executando.
  • Exceção verificada (também conhecida como tudo o resto) - Espera-se que os aplicativos sejam capazes de capturar e fazer algo significativo com o resto, como FileNotFoundExceptione TimeoutException...
Eddie
fonte
10
A Oracle diz isso 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/… .
ROMANIA_engineer 14/05
1
A pergunta não respondida é: qual é a diferença entre RuntimeException e Error? Ambos são desmarcados e iguais em todos os sentidos.
Pacerier
38

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.

Hierarquia de exceção Java

avandeursen
fonte
6
Eu adoraria ver alguém se recuperando de um NullPointerException: D: D: D
Ignacio Soler Garcia
2
@IgnacioSolerGarcia Pode ser e até faz sentido (a outra pergunta é se é boa). Normalmente você verifica se o objeto existe e depois chama o método ou usa o campo. Mas, em vez de verificar a existência, tente capturar o NPE. E registre uma mensagem sobre isso e continue, por exemplo.
Gangnus 14/03/19
@ Gangnus: não faz sentido. Lembre-se que uma exceção ignora partes do código e é uma maneira de relatar erros, operações não normais
Ignacio Soler Garcia
17

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.

Robin
fonte
Veja examples.javacodegeeks.com/java-basics/exceptions/… como exemplo. IllegalArgumentException é exceção de tempo de execução, não Erro. docs.oracle.com/javase/7/docs/api/java/lang/…
Gangnus 14/03/19
8

Erros -

  1. Errors em Java são do tipo java.lang.Error.
  2. Todos os erros no java são do tipo desmarcado.
  3. Errors acontecem em tempo de execução. Eles não serão conhecidos pelo compilador.
  4. É impossível recuperar de erros.
  5. Errors são causados ​​principalmente pelo ambiente em que o aplicativo está sendo executado.
  6. Exemplos: java.lang.StackOverflowError ,java.lang.OutOfMemoryError

Exceções -

  1. Exceptions em Java são do tipo java.lang.Exception.
  2. Exceptions incluem os tipos marcado e não marcado.
  3. As exceções verificadas são conhecidas pelo compilador, enquanto as exceções não verificadas não são conhecidas pelo compilador porque ocorrem no tempo de execução.
  4. Você pode se recuperar de exceções manipulando-as através de try-catchblocos.
  5. Exceptions são causados ​​principalmente pelo próprio aplicativo.
  6. Exemplos: As excepções Verificado: SQLException, IOException
    Excepções não marcados: ArrayIndexOutOfBoundException, ClassCastException,NullPointerException

leitura adicional: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/ http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png

roottraveller
fonte
7

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.

Powerlord
fonte
3

A descrição da Errorclasse é bastante clara:

An Erroré uma subclasse 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 ThreadDeath erro, embora seja uma condição "normal", também é uma subclasse Errorporque 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 Errorque 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 Errors, 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.

Tobias Müller
fonte
2

Existem várias semelhanças e diferenças entre classes java.lang.Exceptione java.lang.Error.

Semelhanças:

  • Primeiro - ambas as classes estende java.lang.Throwablee, como resultado herda muitos dos métodos que são comuns a ser usado quando se lida com os erros, tais como: getMessage, getStackTrace, printStackTracee assim por diante.

  • Segundo, como subclasses das java.lang.Throwableduas 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 throwspalavra-chave Tal declaração exigida apenas para java.lang.Exceptione subclasses, por java.lang.Throwable, java.lang.Errore java.lang.RuntimeExceptione suas subclasses é opcional.

    • Somente java.lang.Throwablee subclasses podem ser usadas na catchcláusula.

    • Somente java.lang.Throwablee subclasses podem ser usadas com a palavra-chave - throw.

A conclusão a partir desta propriedade está seguindo ambos java.lang.Errore java.lang.Exceptionpode ser declarada no cabeçalho do método, pode ser em catchcláusula, pode ser usado com palavra-chave throw.

Diferenças:

  • Primeira - diferença conceitual: java.lang.Errorprojetada 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.Throwablesucessor).

    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.Exceptionprojetado 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.

  • A segunda diferença entre java.lang.Errore java.lang.Exceptiona 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.Errorou suas subclasses não requer que esse erro seja declarado no cabeçalho do método. Ao lançar a java.lang.Exceptiondeclaração necessária no cabeçalho do método.

Throwable e seu diagrama de classes sucessora (propriedades e métodos são omitidos). insira a descrição da imagem aqui

Mikhailov Valentine
fonte
1

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.

Sr. Will
fonte
1

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

user2485429
fonte
"Os erros são causados ​​principalmente pelo ambiente em que o aplicativo está sendo executado" e "As exceções são causadas principalmente pelo próprio aplicativo" perfeito!
ADJ
0

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.

egaga
fonte
0

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. OutOfMemoryErrorocorre quando a JVM fica sem memória ou StackOverflowErrorocorre 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: NullPointerExceptionocorre 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.

pasignatura
fonte