Diferencia entre java.lang.RuntimeException y java.lang.Exception

210

Alguien por favor explique la diferencia entre java.lang.RuntimeExceptiony java.lang.Exception? ¿Cómo decido cuál extender si creo mi propia excepción?

campeon
fuente

Respuestas:

181

Generalmente, RuntimeExceptions son excepciones que se pueden evitar mediante programación. Por ejemplo NullPointerException, ArrayIndexOutOfBoundException. Si verifica nullantes de llamar a cualquier método, NullPointerExceptionnunca ocurriría. De manera similar ArrayIndexOutOfBoundException, nunca ocurriría si revisa el índice primero. RuntimeExceptionno son verificados por el compilador, por lo que es un código limpio.

EDITAR : en estos días la gente favorece RuntimeExceptionporque el código limpio que produce. Es totalmente una elección personal.

fastcodejava
fuente
10
Me gusta este ángulo de "excepciones de tiempo de ejecución podrían haber sido evitadas por la persona que llama". Eso significa que usted (como la persona que llama de un método) debe asegurarse de que ni siquiera suceda. Mientras que las excepciones marcadas son algo que no puede evitar y, en su lugar, debe tratarlas después del hecho. (Y sí, dado que no todos están de acuerdo con el concepto de excepciones marcadas y muchas personas usan RuntimeException para todo, esta distinción se ha vuelto un poco confusa).
Thilo
44
Hoy en día, las personas también prefieren RuntimeException no verificada, porque es compatible con el procesamiento Java 8 Lambda, mientras que las excepciones marcadas de tipo Exception no lo son.
Hartmut P.
2
Sospecho que la verdadera razón por la que las personas se dan cuenta RuntimeExceptiones 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.
Dónal
186

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.

Andy White
fuente
3
Prácticamente es cierto que "hay dos tipos de excepciones", pero ¿por qué la documentación de Oracle dice que hay tres tipos? Considera el error como tercer tipo. Creo que el error no es una excepción en absoluto, es solo Throwable (objeto), sí, imita el comportamiento de las excepciones de tiempo de ejecución. ¿Qué dirías al respecto? Oracle doc. árbitro. docs.oracle.com/javase/tutorial/essential/exceptions/…
Asif Shahzad
3
Un error no debe ser detectado (aunque podría serlo) generalmente usa errores para detectar sus propios errores mientras trabaja en un nuevo código. Por ejemplo, si tiene un árbol si la instrucción if / elseif, la última cosa podría arrojar Error ("no esperaba que ocurriera esta condición") ;. En términos generales, las excepciones tienen casos de uso donde se supone que suceden, mientras que los errores no tienen un caso de uso y son un error.
Danny
55
Pero la broma es que RunTimeException en sí extiende la Excepción: D (Sé que esto no causa ningún problema y JVM se encarga de todo el contexto)
Alireza Mohamadi
94

Antes de ver la diferencia entre java.lang.RuntimeExceptiony java.lang.Exceptionclases, debe conocer la Exceptionjerarquía. Ambos Exceptiony las Errorclases se derivan de la clase Throwable(que deriva de la clase Object). Y la clase RuntimeExceptionse deriva de la clase Exception.

Todas las excepciones se derivan de Exceptiono RuntimeException.

Todas las excepciones derivadas RuntimeExceptionse 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.Exceptiony 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 
GAJJE82
fuente
47

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.

Lawrence Dol
fuente
15

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 executepuede lanzar una RuntimeException pero la declaración del método no necesita especificar que arroja RuntimeException .

El método processarroja 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).

sateesh
fuente
13

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 RuntimeExceptiony una excepción marcada es una derivada de Exception.

¿Por qué lanzar un RuntimeExceptionsi 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.

Mahdi Esmaeili
fuente
5

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

iberck
fuente
4

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 .

Joe Almore
fuente
3

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

jayrhd
fuente
0

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.

FOO
fuente
0

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

Bhagwati Malav
fuente
0
  1. 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.

  2. La excepción definida por el usuario puede ser una excepción marcada personalizada, si se extiende a la clase de excepción

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

  4. Defina una clase y conviértala en una excepción de Excepción o Ejecución

Aditya
fuente