Diferencias entre excepción y error

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

Los errores no deben ser capturados o manejados (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 graves que una aplicación razonable no debería intentar atrapar. La mayoría de esos errores son condiciones anormales.

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

  • AnnotationFormatError : lanzado 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 aserción ha fallado.
  • LinkageError – Las subclases de LinkageError indican que una clase tiene cierta dependencia en otra clase; sin embargo, la última clase ha cambiado de manera incompatible después de la comstackción de la primera clase.
  • VirtualMachineError : lanzado para indicar que la máquina virtual Java está rota o se ha quedado sin recursos necesarios para que continúe funcionando.

En realidad, hay tres subcategorías importantes de Throwable :

  • Error : algo suficientemente grave ha ido mal, la mayoría de las aplicaciones deberían fallar en lugar de tratar de resolver el problema,
  • Excepción no comprobada (también conocida como RuntimeException ): muy a menudo un error de progtwigción como NullPointerException o un argumento ilegal. Las aplicaciones a veces pueden manejar o recuperarse de esta categoría de Throwable , o al menos capturarla en el método run() Thread, registrar el reclamo y continuar ejecutándose.
  • Excepción comprobada (también conocida como Todo lo demás): se espera que las aplicaciones capturen y hagan algo de manera significativa con el rest, como FileNotFoundException y TimeoutException

Esta diapositiva que muestra la jerarquía de excepciones de Java por @ georgios-gousios explica de manera concisa las diferencias entre Errores y Excepciones en Java.

Jerarquía de excepciones Java

Los errores tienden a indicar el final de su aplicación tal como la conoce. Por lo general, no se puede recuperar y debe hacer que su máquina virtual salga. No debe capturarlos, excepto posiblemente para registrar o mostrar y el mensaje apropiado antes de salir.

Ejemplo: OutOfMemoryError : no hay mucho que pueda hacer ya que su progtwig ya no se puede ejecutar.

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

Ejemplo: IllegalArgumentException – Pasó datos no válidos a un método por lo que la llamada al método falló, pero no afecta las operaciones futuras.

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

Sun lo pone mejor :

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

La descripción de la clase Error es bastante clara:

Un Error es una subclase de Throwable que indica problemas graves que una aplicación razonable no debería intentar atrapar. La mayoría de esos 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 atraparlo.

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

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

En resumen, no debería detectar Error s, excepto que tiene 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í).

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

Errores –

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

Excepciones –

  1. Exception s en Java son de tipo java.lang.Exception .
  2. Exception incluyen tanto el tipo marcado como el no marcado.
  3. El comstackdor conoce las excepciones comprobadas, ya que el comstackdor desconoce las excepciones no comprobadas porque ocurren en tiempo de ejecución.
  4. Puede recuperarse de las excepciones manipulándolas a través try-catch bloques try-catch .
  5. Exception son causadas principalmente por la aplicación en sí.
  6. Ejemplos: Excepciones SQLException : SQLException , IOException
    Excepciones no ArrayIndexOutOfBoundException : 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

Hay varias similitudes y diferencias entre las clases java.lang.Exception y java.lang.Error .

Semejanzas

  • Primero: ambas clases extienden java.lang.Throwable y, como resultado, heredan muchos de los métodos que se usan comúnmente cuando se trata de errores tales como: getMessage , getStackTrace , printStackTrace , etc.

  • Segundo, como subclases de java.lang.Throwable ambos heredan las siguientes propiedades:

    • Throwable sí mismo y cualquiera de sus subclases (incluido java.lang.Error ) se puede declarar en la lista de excepciones de método utilizando throws keyword. Dicha statement solo es necesaria para java.lang.Exception y las subclases, para java.lang.Throwable , java.lang.Error y java.lang.RuntimeException y sus subclases es opcional.

    • Solo se permite usar java.lang.Throwable y subclases en la cláusula catch .

    • Solo java.lang.Throwable y las subclases se pueden usar con la palabra clave – throw .

La conclusión de esta propiedad es que tanto java.lang.Error como java.lang.Exception pueden declararse en el encabezado del método, pueden estar en catch clause, pueden usarse con keyword throw .

Diferencias

  • Primero – diferencia conceptual: java.lang.Error diseñado para ser lanzado por la JVM e indicar problemas graves y destinado a detener la ejecución del progtwig en lugar de ser capturado (pero es posible como para cualquier otro sucesor de java.lang.Throwable ).

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

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

    En oposición java.lang.Exception diseñada para representar los errores que se esperan y puede ser manejada por un progtwigdor sin terminar la ejecución del progtwig.

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

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

  • La segunda diferencia entre java.lang.Error y java.lang.Exception que primero se consideró una excepción no verificada para la comprobación de excepciones en tiempo de comstackción. Como el código de resultado arrojando java.lang.Error o sus subclases no requieren declarar este error en el encabezado del método. Al arrojar java.lang.Exception statement obligatoria en el encabezado del método.

Throwable y su diagtwig de clase sucesora (se omiten las propiedades y los métodos). enter image description here

Un error de IMO es algo que puede causar que su aplicación falle y no debe ser manejada. Una excepción es algo que puede causar resultados impredecibles, pero que puede recuperarse.

Ejemplo:

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

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 graves que una aplicación razonable no debería intentar atrapar. La mayoría de esos 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 atraparlo.

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

OTOH, por Excepciones, Java API dice:

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

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

Las excepciones son causadas principalmente por la aplicación en sí. Por ejemplo, NullPointerException se produce cuando una aplicación intenta acceder a un objeto nulo o se produce una excepción ClassCastException cuando una aplicación intenta convertir tipos de clases incompatibles.

Fuente: Diferencia entre error Vs Excepción en Java