Respuestas:
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 como NullPointerException
.
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.
Antes de ver la diferencia entre java.lang.RuntimeException
y java.lang.Exception
clases, debe conocer la Exception
jerarquía. Ambos Exception
y las Error
clases se derivan de la clase Throwable
(que deriva de la clase Object
). Y la clase RuntimeException
se deriva de la clase Exception
.
Todas las excepciones se derivan de Exception
o RuntimeException
.
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 derivan java.lang.RuntimeException
.
Las siguientes son algunas de las subclases conocidas directas de RuntimeException .
AnnotationTypeMismatchException,
ArithmeticException,
ArrayStoreException,
BufferOverflowException,
BufferUnderflowException,
CannotRedoException,
CannotUndoException,
ClassCastException,
CMMException,
ConcurrentModificationException,
DataBindingException,
DOMException,
EmptyStackException,
EnumConstantNotPresentException,
EventException,
IllegalArgumentException,
IllegalMonitorStateException,
IllegalPathStateException,
IllegalStateException,
ImagingOpException,
IncompleteAnnotationException,
IndexOutOfBoundsException,
JMRuntimeException,
LSException,
MalformedParameterizedTypeException,
MirroredTypeException,
MirroredTypesException,
MissingResourceException,
NegativeArraySizeException,
NoSuchElementException,
NoSuchMechanismException,
NullPointerException,
ProfileDataException,
ProviderException,
RasterFormatException,
RejectedExecutionException,
SecurityException,
SystemException,
TypeConstraintException,
TypeNotPresentException,
UndeclaredThrowableException,
UnknownAnnotationValueException,
UnknownElementException,
UnknownTypeException,
UnmodifiableSetException,
UnsupportedOperationException,
WebServiceException
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.
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:
//Create your own exception class subclassing from Exception
class MyException extends Exception {
public MyException(final String message) {
super(message);
}
}
public class Process {
public void execute() {
throw new RuntimeException("Runtime");
}
public void process() throws MyException {
throw new MyException("Checked");
}
}
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 formulario
new Process().process()
da un error de compilación. Esto se debe a que el código del cliente debe tomar medidas para manejar MyException
(por ejemplo, call to process () puede encerrarse en un bloque try / catch).
Uso adecuado de RuntimeException?
De excepciones no controladas - La controversia :
Si se puede esperar razonablemente que un cliente se recupere de una excepción, conviértalo en una excepción marcada. Si un cliente no puede hacer nada para recuperarse de la excepción, conviértalo en una excepción no verificada.
Tenga en cuenta que una excepción no verificada es una derivada de RuntimeException
y una excepción marcada es una derivada de Exception
.
¿Por qué lanzar un RuntimeException
si un cliente no puede hacer nada para recuperarse de la excepción? El artículo explica:
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. Tales problemas incluyen excepciones aritméticas, como dividir por cero; excepciones de puntero, como intentar acceder a un objeto a través de una referencia nula; e excepciones de indexación, como intentar acceder a un elemento de matriz a través de un índice que es demasiado grande o demasiado pequeño.
De la documentación de Oracle:
Aquí está la pauta final: si se puede esperar razonablemente que un cliente se recupere de una excepción, conviértalo en una excepción marcada. Si un cliente no puede hacer nada para recuperarse de la excepción, conviértalo en una excepción no verificada.
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 ...
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 .
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
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.
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
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