Diferencias entre excepción y error

173

Estoy tratando de aprender más sobre Java básico y los diferentes tipos de Throwables, ¿alguien puede decirme las diferencias entre Excepciones y Errores?

Marco Leung
fuente

Respuestas:

178

Los errores no deben detectarse ni manejarse (excepto en los casos más raros). Las excepciones son el pan y la mantequilla del manejo de excepciones. El Javadoc lo explica bien:

Un error es una subclase de Throwable que indica problemas serios que una aplicación razonable no debería intentar detectar. La mayoría de estos errores son condiciones anormales.

Mire algunas de las subclases de Error, tomando algunos de sus comentarios JavaDoc:

  • AnnotationFormatError - Se produce cuando el analizador de anotaciones intenta leer una anotación de un archivo de clase y determina que la anotación está mal formada.
  • AssertionError - Lanzado para indicar que una afirmación ha fallado.
  • LinkageError- Las subclases de LinkageError indican que una clase tiene cierta dependencia de otra clase; sin embargo, la última clase ha cambiado de manera incompatible después de la compilación de la clase anterior.
  • VirtualMachineError - Lanzado para indicar que la máquina virtual Java está rota o se ha quedado sin recursos necesarios para que continúe funcionando.

Realmente hay tres subcategorías importantes de Throwable:

  • Error - Algo suficientemente grave ha salido mal, la mayoría de las aplicaciones deberían fallar en lugar de tratar de solucionar el problema,
  • Excepción no verificada (aka RuntimeException): muy a menudo, un error de programación como un NullPointerExceptionargumento o un argumento ilegal. Las aplicaciones a veces pueden manejar o recuperarse de esta Throwablecategoría, o al menos capturarla en el run()método de Thread , registrar la queja y continuar ejecutándose.
  • Excepción marcada (también conocido como Todo lo demás): se espera que las aplicaciones puedan capturar y hacer algo significativo con el resto, como FileNotFoundExceptiony TimeoutException...
Eddie
fuente
10
Oracle dice eso Unchecked exceptions != RuntimeExceptions; Unchecked exceptions = RuntimeExceptions + Errors. Sé que plantea la pregunta: ¿Es el error una excepción? , pero esto es lo que escriben. Este es solo uno de esos ejemplos: docs.oracle.com/javase/tutorial/essential/exceptions/… .
ROMANIA_engineer
1
La pregunta sin respuesta es ¿en qué se diferencian RuntimeException y Error en esencia? Ambos están desmarcados e iguales en todos los demás aspectos.
Pacerier
38

Esta diapositiva muestra la jerarquía de excepciones de Java por @ georgios-gousios explica de forma concisa las diferencias entre los errores y excepciones en Java.

Jerarquía de excepciones Java

avandeursen
fuente
66
Me encantaría ver a alguien recuperarse de un NullPointerException: D: D: D
Ignacio Soler Garcia
2
@IgnacioSolerGarcia Puede ser e incluso tiene sentido (la otra pregunta es si es bueno). Normalmente verifica si el objeto existe y luego llama al método o usa el campo. Pero puede, en lugar de verificar la existencia, intentar atrapar NPE. Y registre un mensaje al respecto y continúe, por ejemplo.
Gangnus
@Gangnus: no tiene sentido. Recuerde que una excepción omite partes del código y es una forma de informar errores, no operaciones normales
Ignacio Soler Garcia
17

Los errores tienden a señalar el final de su aplicación tal como la conoce. Por lo general, no se puede recuperar y debería hacer que su VM salga. No se debe capturarlos, excepto para registrar o mostrar un mensaje apropiado antes de salir.

Ejemplo: OutOfMemoryError : no puede hacer mucho ya que su programa ya no puede ejecutarse.

Las excepciones a menudo son recuperables e incluso cuando no, generalmente solo significan que falló un intento de operación, pero su programa aún puede continuar.

Ejemplo: IllegalArgumentException: se pasaron datos no válidos a un método para que la llamada al método fallara, pero no afecta las operaciones futuras.

Estos son ejemplos simplistas, y hay otra gran cantidad de información solo en Excepciones.

Robin
fuente
Mira ejemplos.javacodegeeks.com/java-basics/exceptions/... como ejemplo. IllegalArgumentException es una excepción en tiempo de ejecución, no un error. docs.oracle.com/javase/7/docs/api/java/lang/…
Gangnus
8

errores -

  1. Errors en java son de tipo java.lang.Error.
  2. Todos los errores en Java son de tipo desmarcado.
  3. Errors suceden en tiempo de ejecución. No serán conocidos por el compilador.
  4. Es imposible recuperarse de los errores.
  5. Errors son causados ​​principalmente por el entorno en el que se ejecuta la aplicación.
  6. Ejemplos: java.lang.StackOverflowError ,java.lang.OutOfMemoryError

excepciones -

  1. Exceptions en java son de tipo java.lang.Exception.
  2. Exceptions incluyen tanto el tipo marcado como el no marcado.
  3. El compilador conoce las excepciones marcadas, mientras que el compilador no conoce las excepciones no marcadas porque se producen en tiempo de ejecución.
  4. Puede recuperarse de las excepciones al manejarlos a través de try-catchbloques.
  5. Exceptions son causados ​​principalmente por la aplicación misma.
  6. Ejemplos: excepciones comprobadas: SQLException, IOException
    Excepciones Desactivada: ArrayIndexOutOfBoundException, ClassCastException,NullPointerException

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

roottraveller
fuente
7

Sun lo pone mejor :

Un error es una subclase de Throwable que indica problemas serios que una aplicación razonable no debería intentar detectar.

Powerlord
fuente
3

La descripción de la Errorclase es bastante clara:

Una Errores una subclase de Throwable que indica problemas serios que una aplicación razonable no debería intentar detectar. La mayoría de estos errores son condiciones anormales. El ThreadDeath error, aunque es una condición "normal", también es una subclase Errorporque la mayoría de las aplicaciones no deberían intentar detectarlo.

No se requiere que un método declare en su cláusula throws cualquier subclase Errorque pueda lanzarse durante la ejecución del método pero que no se detecte, ya que estos errores son condiciones anormales que nunca deberían ocurrir.

Citado de la propia documentación deError Java de la clase .

En resumen, no debes atrapar Errors, excepto que tienes una buena razón para hacerlo. (Por ejemplo, para evitar que su implementación del servidor web se bloquee si un servlet se queda sin memoria o algo así).

Un Exception, por otro lado, es solo una excepción normal como en cualquier otro lenguaje moderno. Encontrará una descripción detallada en la documentación de la API de Java o en cualquier recurso en línea o fuera de línea.

Tobias Müller
fuente
2

Hay varias similitudes y diferencias entre clases java.lang.Exceptiony java.lang.Error.

Similitudes:

  • En primer lugar - ambas clases se extiende java.lang.Throwabley, como resultado hereda muchos de los métodos que son comunes a usarse cuando se trata de errores tales como: getMessage, getStackTrace, printStackTracey así sucesivamente.

  • En segundo lugar, como subclases de java.lang.Throwableambos, heredan las siguientes propiedades:

    • Throwable y cualquiera de sus subclases (incluidas java.lang.Error) se pueden declarar en la lista de excepciones de métodos utilizando la throwspalabra clave. Dicha declaración se requiere solamente para java.lang.Exceptiony subclases, por java.lang.Throwable, java.lang.Errory java.lang.RuntimeExceptiony sus subclases es opcional.

    • Solo java.lang.Throwabley las subclases permitidas en la catchcláusula.

    • Solo java.lang.Throwabley las subclases se pueden usar con la palabra clave - throw.

La conclusión de esta propiedad es seguir ambos java.lang.Errory java.lang.Exceptionpuede declararse en el encabezado del método, puede estar en una catchcláusula, puede usarse con una palabra clave throw.

Diferencias:

  • Primero: diferencia conceptual: java.lang.Errordiseñado para ser lanzado por la JVM e indicar problemas serios y destinado a detener la ejecución del programa en lugar de ser atrapado (pero es posible como para cualquier otro java.lang.Throwablesucesor).

    Un pasaje de la descripción de javadoc sobre java.lang.Error:

    ... indica problemas serios que una aplicación razonable no debería intentar detectar.

    En contrario java.lang.Exceptiondiseñado para representar los errores que esperaba y puede ser manejado por un programador sin terminar la ejecución del programa.

    Un pasaje de la descripción de javadoc sobre java.lang.Exception:

    ... indica condiciones que una aplicación razonable podría querer atrapar.

  • La segunda diferencia entre java.lang.Errory java.lang.Exceptionla primera considerada como una excepción no verificada para la verificación de excepciones en tiempo de compilación. Como el lanzamiento de código de resultado java.lang.Erroro sus subclases no requieren declarar este error en el encabezado del método. Mientras arroja la java.lang.Exceptiondeclaración requerida en el encabezado del método.

Throwable y su diagrama de clase sucesor (se omiten las propiedades y los métodos). ingrese la descripción de la imagen aquí

Mikhailov Valentine
fuente
1

OMI, un error es algo que puede hacer que su aplicación falle y no debe manejarse. Una excepción es algo que puede causar resultados impredecibles, pero que puede recuperarse.

Ejemplo:

Si un programa se ha quedado sin memoria, es un error ya que la aplicación no puede continuar. Sin embargo, si un programa acepta un tipo de entrada incorrecto, es una excepción, ya que el programa puede manejarlo y redirigirlo para recibir el tipo de entrada correcto.

Señor will
fuente
1

Los errores son causados ​​principalmente por el entorno en el que se ejecuta la aplicación. Por ejemplo, OutOfMemoryError ocurre cuando JVM se queda sin memoria o StackOverflowError ocurre cuando la pila se desborda.

Las excepciones son causadas principalmente por la aplicación misma. Por ejemplo, NullPointerException se produce cuando una aplicación intenta acceder a un objeto nulo o ClassCastException se produce cuando una aplicación intenta emitir tipos de clase incompatibles.

Fuente: Diferencia entre error Vs Excepción en Java

usuario2485429
fuente
"Los errores son causados ​​principalmente por el entorno en el que se ejecuta la aplicación" y "¡Las excepciones son causadas principalmente por la aplicación misma", ¡perfecto!
ADJ
0

Aquí hay un resumen bastante bueno de la API de Java que representa un error y una excepción:

Un error es una subclase de Throwable que indica problemas serios que una aplicación razonable no debería intentar detectar. La mayoría de estos errores son condiciones anormales. El error ThreadDeath, aunque es una condición "normal", también es una subclase de Error porque la mayoría de las aplicaciones no deberían intentar detectarlo.

No se requiere que un método declare en su cláusula throws ninguna subclase de Error que pueda lanzarse durante la ejecución del método pero que no se detecte, ya que estos errores son condiciones anormales que nunca deberían ocurrir.

OTOH, para excepciones, la API de Java dice:

La clase Exception y sus subclases son una forma de Throwable que indica condiciones que una aplicación razonable podría querer atrapar.

egaga
fuente
0

Los errores son causados ​​por el entorno donde se ejecuta su aplicación o programa. La mayoría de las veces, es posible que no se recupere, ya que esto finaliza su aplicación o programa. Javadoc le aconsejó que no debería molestarse en detectar tales errores ya que el entorno, por ejemplo, JVM, en tales errores se va a cerrar de todos modos.

Ejemplos: VirtualMachineError- Lanzado para indicar que la máquina virtual Java está rota o se ha quedado sin recursos necesarios para que continúe funcionando. OutOfMemoryErrorse produce cuando JVM se queda sin memoria o se StackOverflowErrorproduce cuando se sobrepasa la pila.

Las excepciones son causadas por su aplicación o programa en sí; tal vez debido a tu propio error. La mayoría de las veces puede recuperarse de él y su aplicación continuará ejecutándose. Se recomienda detectar dichos errores para evitar la finalización anormal de su aplicación o programa y / o poder personalizar el mensaje de excepción para que los usuarios vean un mensaje bien formateado en lugar de los mensajes de excepción feos predeterminados dispersos por todo el lugar.

Ejemplos: NullPointerExceptionocurre cuando una aplicación intenta acceder a un objeto nulo. o Intentar acceder a una matriz con un índice no existente o llamar a una función con datos o parámetros incorrectos.

pasignaturaleza
fuente