Alguien por favor explique la diferencia entre java.lang.RuntimeException
y java.lang.Exception
? ¿Cómo decido cuál extender si creo mi propia excepción?
210
Generalmente, RuntimeExceptions son excepciones que se pueden evitar mediante programación. Por ejemplo NullPointerException
, ArrayIndexOutOfBoundException
. Si verifica null
antes de llamar a cualquier método, NullPointerException
nunca ocurriría. De manera similar ArrayIndexOutOfBoundException
, nunca ocurriría si revisa el índice primero. RuntimeException
no son verificados por el compilador, por lo que es un código limpio.
EDITAR : en estos días la gente favorece RuntimeException
porque el código limpio que produce. Es totalmente una elección personal.
RuntimeException
es porque es simple y evita la necesidad de pensar en las diferencias entre las excepciones marcadas y no marcadas. Creo que capturar excepciones de tiempo de ejecución es una idea terrible porque capturará excepciones irrecuperables comoNullPointerException
.En Java, hay dos tipos de excepciones: excepciones marcadas y excepciones no marcadas. Una excepción verificada debe ser manejada explícitamente por el código, mientras que una excepción no verificada no necesita ser manejada explícitamente.
Para las excepciones marcadas, debe colocar un bloque try / catch alrededor del código que podría lanzar la excepción, o agregar una cláusula "throws" al método, para indicar que el método podría lanzar este tipo de excepción (que debe ser manejado en la clase de llamada o superior).
Cualquier excepción que se deriva de "Excepción" es una excepción marcada, mientras que una clase que deriva de RuntimeException no está marcada. RuntimeExceptions no necesita ser manejado explícitamente por el código de llamada.
fuente
Antes de ver la diferencia entre
java.lang.RuntimeException
yjava.lang.Exception
clases, debe conocer laException
jerarquía. AmbosException
y lasError
clases se derivan de la claseThrowable
(que deriva de la claseObject
). Y la claseRuntimeException
se deriva de la claseException
.Todas las excepciones se derivan de
Exception
oRuntimeException
.Todas las excepciones derivadas
RuntimeException
se denominan excepciones no verificadas . Y todas las demás excepciones son excepciones marcadas . Se debe detectar una excepción marcada en algún lugar de su código; de lo contrario, no se compilará. Es por eso que se llaman excepciones marcadas. Por otro lado, con excepciones no verificadas, el método de llamada no tiene la obligación de manejarlo o declararlo.Por lo tanto, todas las excepciones de las cuales el compilador te obliga a manejar se derivan directamente
java.lang.Exception
y todas las demás de las cuales el compilador no te obliga a manejar se derivanjava.lang.RuntimeException
.Las siguientes son algunas de las subclases conocidas directas de RuntimeException .
fuente
Se marca una excepción y se desmarca una RuntimeException.
Marcado significa que el compilador requiere que manejes la excepción en un catch o declares tu método como arrojándolo (o una de sus superclases).
En general, arroje una excepción marcada si se espera que la persona que llama de la API maneje la excepción, y una excepción no marcada si es algo que la persona que llama normalmente no podría manejar, como un error con uno de los parámetros, es decir, una programación Error.
fuente
Las clases de excepción de tiempo de ejecución (RuntimeException y sus subclases) están exentas de la verificación en tiempo de compilación, ya que el compilador no puede establecer que no puedan ocurrir excepciones en tiempo de ejecución. (de JLS).
En las clases que diseñe, debe subclasificar Exception y lanzar instancias para indicar cualquier escenario excepcional. Al hacerlo, indicará explícitamente a los clientes de su clase que el uso de su clase podría generar una excepción y que deben tomar medidas para manejar esos escenarios excepcionales.
Los fragmentos de código a continuación explican este punto:
En la definición de clase anterior de la clase Proceso , el método
execute
puede lanzar una RuntimeException pero la declaración del método no necesita especificar que arroja RuntimeException .El método
process
arroja una excepción marcada y debería declarar que arrojará una excepción marcada del tipo MyException y no hacerlo será un error de compilación.La definición de clase anterior afectará el código que usa la clase de proceso también.
La llamada
new Process().execute()
es una invocación válida donde como la llamada del formularionew Process().process()
da un error de compilación. Esto se debe a que el código del cliente debe tomar medidas para manejarMyException
(por ejemplo, call to process () puede encerrarse en un bloque try / catch).fuente
Uso adecuado de RuntimeException?
De excepciones no controladas - La controversia :
Tenga en cuenta que una excepción no verificada es una derivada de
RuntimeException
y una excepción marcada es una derivada deException
.¿Por qué lanzar un
RuntimeException
si un cliente no puede hacer nada para recuperarse de la excepción? El artículo explica:fuente
De la documentación de Oracle:
Las excepciones de tiempo de ejecución representan problemas que son el resultado de un problema de programación y, como tal, no se puede esperar razonablemente que el código del cliente API se recupere de ellos o los maneje de ninguna manera.
RuntimeExceptions son como "excepciones por el uso no válido de una API" ejemplos de excepciones de tiempo de ejecución: IllegalStateException, NegativeArraySizeException, NullpointerException
Con las Excepciones, debe atraparlo explícitamente porque aún puede hacer algo para recuperarse. Ejemplos de excepciones son: IOException, TimeoutException, PrintException ...
fuente
En palabras simples, si su cliente / usuario puede recuperarse de la Excepción, entonces conviértalo en una Excepción marcada , si su cliente no puede hacer nada para recuperarse de la Excepción, hágalo Descontrolado RuntimeException . Por ejemplo, una RuntimeException sería un error programático, como la división por cero, ningún usuario puede hacer nada al respecto, sino el propio programador, entonces es una RuntimeException .
fuente
RuntimeException es una clase secundaria de la clase Exception
Esta es una de las muchas clases secundarias de la clase Excepción. RuntimeException es la superclase de esas excepciones que se pueden generar durante el funcionamiento normal de la máquina virtual Java. No se requiere que un método declare en su cláusula throws ninguna subclase de RuntimeException que pueda lanzarse durante la ejecución del método pero no detectarse.
La jerarquía es
java.lang.Object
--- java.lang.Throwable
------- java.lang.Exception
------------- java.lang.RuntimeException
fuente
Las excepciones son una buena manera de manejar eventos inesperados en el flujo de su aplicación. RuntimeException no está marcada por el compilador, pero es posible que prefiera usar excepciones que extiendan la clase de excepción para controlar el comportamiento de sus clientes api, ya que deben capturar errores para que puedan compilar. También forma buena documentación.
Si desea lograr una interfaz limpia, use la herencia para subclasificar los diferentes tipos de excepción que tiene su aplicación y luego exponga la excepción principal.
fuente
Hay dos tipos de excepción. Puede recuperarse de una excepción marcada si obtiene ese tipo de excepción. Las excepciones de tiempo de ejecución son irrecuperables, las excepciones de tiempo de ejecución son errores de programación y el programador debe encargarse de ello mientras escribe el código, y continuar la ejecución de este podría dar un resultado incorrecto. Las excepciones de tiempo de ejecución son sobre violar la precondición, por ej. tiene una matriz de tamaño 10 y está intentando acceder al 11º elemento, arrojará ArrayIndexOutOfBoundException
fuente
La excepción definida por el usuario puede ser una excepción marcada o una excepción no marcada, depende de la clase a la que se extiende.
La excepción definida por el usuario puede ser una excepción marcada personalizada, si se extiende a la clase de excepción
La excepción definida por el usuario puede ser una excepción personalizada sin marcar, si se extiende a la clase de excepción de tiempo de ejecución.
Defina una clase y conviértala en una excepción de Excepción o Ejecución
fuente