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?Diferencias entre Excepción y Error
Respuesta
No se deben atrapar o manipular los errores (excepto en los casos más raros). Las excepciones son el pan y la mantequilla del manejo de excepciones. El Javadoc lo explica así:
un error es una subclase de Throwable que indica serios problemas que una aplicación razonable no debe tratar de atrapar. La mayoría de estos errores son condiciones anormales .
vistazo a algunas de las subclases de Error
, teniendo algunos de sus comentarios JavaDoc:
AnnotationFormatError
- Se emite cuando el analizador de anotación intenta leer una anotación de un archivo de clase y determina que la anotación está malformado.AssertionError
- Lanzado para indicar que una afirmació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 compilació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 lo suficientemente grave como se ha hecho mal la mayoría de las aplicaciones deben chocar en lugar de tratar de manejar el problema,- excepción no comprobada (aka
RuntimeException
) - Muy a menudo un error de programación comoNullPointerException
o un argumento ilegal. Las aplicaciones a veces pueden manejar o recuperarse de esta categoríaThrowable
, o al menos captarla en el métodorun()
del Thread, registrar la queja y continuar ejecutándose. - excepción comprobada (también conocido como todo lo demás) - Se espera que las aplicaciones sean capaces de atrapar y hacer algo de manera significativa con el resto, como
FileNotFoundException
yTimeoutException
...
errores tienden a indicar el final de su aplicación como lo sabes 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 programa ya no se puede ejecutar.
Las excepciones son a menudo recuperables e incluso cuando no lo son, generalmente significan que un intento de operación falló, pero su programa aún puede continuar.
Ejemplo: IllegalArgumentException - Aprobado datos no válidos a un método para que la llamada método falló, pero no afecta a las operaciones futuras.
Estos son ejemplos simplistas, y hay otra gran cantidad de información solo en Excepciones.
Sun puts it best:
un error es una subclase de Throwable que indica serios problemas que una aplicación razonable no debe tratar para ponerse al día.
La descripción de la clase Error
es bastante claro:
Un
Error
es una subclase deThrowable
que indica serios problemas que una aplicación razonable no debe tratar para ponerse al día. La mayoría de estos errores son condiciones anormales. El errorThreadDeath
, aunque es una condición "normal", es también una subclase deError
porque la mayoría de las aplicaciones no deberían tratar de detectar .Un método no está obligado a declarar en su cláusula throws cualquier subclase de
Error
que podrían ser lanzada durante la ejecución del método, pero no atrapado, ya que estos errores son condiciones anormales que no deberían ocurrir.
Citado del propio Java documentation of the class Error
.
En resumen, no debe 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í).
Un Exception
, por el contrario, es solo una excepción normal como en cualquier otro idioma 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.
Aquí está un resumen bastante bueno de la API de Java lo que es un error y de excepción representa:
un error es una subclase de Throwable que indica serios problemas que una aplicación razonable no debe tratar de 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.
Un método no está obligado a declarar en su cláusula throws cualquier subclase de error que podrían ser generados durante la ejecución del método, pero no atrapado, ya que estos errores son condiciones anormales que no deberían ocurrir.
otoh, por excepciones, Java API dice:
La Excepción clase y sus subclases son una forma de Throwable que indica que las condiciones de una aplicación razonable podría querer atrapar.
IMO un error es algo que puede hacer que su aplicación falle y no deba 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 redirigir para recibir el tipo de entrada correcto.
Los errores son causados principalmente por el entorno en el que se está ejecutando la aplicación. Por ejemplo, OutOfMemoryError se produce cuando JVM se queda sin memoria o se produce StackOverflowError cuando la pila 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.
Hay varias similitudes y diferencias entre las clases java.lang.Exception
y java.lang.Error
.
Similitudes:
Primera - ambas clases extiende
java.lang.Throwable
y como resultado hereda muchos de los métodos que son comunes para ser utilizado cuando se trata con errores tales como:getMessage
,getStackTrace
,printStackTrace
y etc.segundo lugar, como son subclases de
java.lang.Throwable
ambos heredan siguientes propiedades:Throwable y cualquiera de sus subclases (incluyendo
java.lang.Error
) puede ser declarada en la lista de excepciones del método utilizandothrows
palabra clave. Dicha declaración requiere solo parajava.lang.Exception
y subclases, parajava.lang.Throwable
,java.lang.Error
yjava.lang.RuntimeException
y sus subclases es opcional.Solo
java.lang.Throwable
y subclases permitidas para el uso en la cláusulacatch
.Solo
java.lang.Throwable
y las subclases se pueden utilizar con la palabra clave -throw
.
La conclusión de esta propiedad está siguiendo tanto java.lang.Error
y java.lang.Exception
se pueden declarar en la cabecera del método, puede estar en catch
cláusula, se puede utilizar con la palabra clave throw
.
Diferencias:
Primera - diferencia conceptual:
java.lang.Error
diseñado para ser arrojada por la JVM e indicar problemas graves y la intención de dejar de la ejecución del programa en lugar de ser capturado (pero es posible que para cualquier otro sucesorjava.lang.Throwable
).Un pasaje de javadoc descripcion de
java.lang.Error
:... indica graves problemas que una aplicación razonable debe no tratar de atrapar.
En opuesta
java.lang.Exception
diseñado para representar los errores que esperado y puede ser manejado por un programador sin necesidad de terminar la ejecución del programa.Un pasaje de javadoc descripcion de
java.lang.Exception
:... indica que las condiciones de una aplicación razonable podría querer captura.
- La segunda diferencia entre
java.lang.Error
yjava.lang.Exception
que primero considera que es un sin marcar excepción para la comprobación de excepción en tiempo de compilación. Como el código de resultado arrojandojava.lang.Error
o sus subclases no requieren declarar este error en el encabezado del método. Al arrojarjava.lang.Exception
declaración obligatoria en el encabezado del método.
Throwable y su diagrama de clase sucesor (se omiten las propiedades y los métodos).
Este slide showing Java's exception hierarchy por @georgios-gousios concisa explica las diferencias entre los errores y excepciones en Java.
Errors -
Error
s en Java son de tipojava.lang.Error
.- Todos los errores en Java están desactivados.
Error
ocurren en tiempo de ejecución. No serán conocidos por el compilador.- Es imposible recuperarse de errores.
Error
s son en su mayoría causados por el entorno en el que se está ejecutando la aplicación.- Ejemplos:
java.lang.StackOverflowError
,java.lang.OutOfMemoryError
Exception
s en Java son de tipojava.lang.Exception
.Exception
s incluyen tanto el tipo marcado como el no marcado.- Se conocen excepciones comprobadas en el compilador donde el compilador desconoce las excepciones no comprobadas porque ocurren en tiempo de ejecución.
- Puede recuperar excepciones manejándolas a través de los bloques
try-catch
. Exception
s son causados principalmente por la aplicación en sí.- Ejemplos: excepciones comprobadas:
SQLException
,IOException
Excepciones Desactivada:ArrayIndexOutOfBoundException
,ClassCastException
,NullPointerException
lectura adicional: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
- 1. Diferencias entre Tiempo de ejecución/Controlado/Sin marcar/Error/Excepción
- 2. ¿Hay diferencias entre "y"
- 3. Diferencias entre NoClassDefFoundError y ClassNotFoundException?
- 4. Diferencias entre `input` y` raw_input`
- 5. Diferencias entre OTL y SOCI
- 6. Diferencias entre JPA y JPA2
- 7. diferencias entre scipy.sparse.linalg.lsmr y scipy.sparse.linalg.lsqr
- 8. Diferencias entre App.Config y Web.Config?
- 9. Diferencias entre Sproutcore y Ember
- 10. Diferencias entre Proc y Lambda
- 11. ¿Diferencias entre Smalltalk y python?
- 12. Diferencias entre Ant y Maven
- 13. diferencias entre memchr() y strchr()
- 14. Diferencias entre DB2 y Oracle
- 15. Diferencias entre utf8 y latin1
- 16. Diferencias entre textMultiLine y textLongMessage
- 17. Diferencias entre Narwhal y Node.js?
- 18. Diferencias entre SwingWorker y Executor
- 19. Diferencias entre Camel y BPEL
- 20. Diferencias entre AForge y OpenCV
- 21. Diferencias entre funtores y endofunctors
- 22. Diferencias entre Perl y PHP
- 23. Diferencias entre .ContextMenu y .ContextMenuStrip
- 24. Diferencias entre struct en C y C++
- 25. Diferencias entre Java y C# y .NET
- 26. Diferencias entre Javascript regexp literal y constructor
- 27. Diferencias entre Android IPC y ContentProvider
- 28. Oracle Diferencias entre NVL y Coalesce
- 29. Diferencias entre ExpandoObject, DynamicObject y dynamic
- 30. C: Diferencias entre strchr() y el índice()
Oracle dice que 'excepciones no comprobadas = RuntimeExceptions';! 'Excepciones no verificadas = 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: https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html. –
La pregunta no respondida es ** ¿cómo es que RuntimeException y Error son diferentes en esencia? ** Ambos están desmarcados e iguales en cualquier otra forma. – Pacerier