2010-03-10 27 views
9

Al leer sobre excepción, siempre me encontraré con excepciones comprobadas y excepciones sin marcar, así que quería saber cómo distinguir qué es qué?¿Cómo identificar las excepciones marcadas y no revisadas en java?

Editar: Quiero saber si creo cualquier clase de excepción, entonces ¿cómo puedo crear como marcado o como no seleccionado?

y cuál es el significado de cada uno?

Respuesta

14

Todos Throwable s excepto las subclases de java.lang.RuntimeException o java.lang.Error están marcados. Correctamente, en Java, "excepciones" son subclases de java.lang.Exception, "errores" son subclases de java.lang.Error y java.lang.Throwable generalmente no se subclasifican directamente. No se supone

Programas para crear sus propios Error subclases (aunque la documentación es bastante ambiguo en eso) por lo general siempre se crea Exceptions, usando un RuntimeException si no desea que se comprueba.

Para conocer en tiempo de ejecución si tiene una marcada excepción puede usar:

if(throwable instanceof Exception && !(throwable instanceof RuntimeException)) { 
    // this is a checked Exception 
    } 

Una excepción comprobada es uno que debe ser manejada de una cláusula catch, o declarado como ser lanzado en la firma del método; el compilador hace cumplir esto. Generalmente, uno usa excepciones marcadas para excepciones que deben ser manejadas por el código de llamada, mientras que las excepciones no revisadas son para condiciones que son el resultado de un error de programación y se deben corregir corrigiendo el código.

Dicho esto, hay mucho debate en la comunidad Java acerca de la eficacia del uso de excepciones comprobadas frente a excepciones sin marcar en todas partes, un tema muy profundo para analizar en esta respuesta.

EDITAR 10/23/2012: En respuesta a los comentarios (que son bastante válida), para aclarar, lo siguiente sería lo que se requiere para determinar si un capturado Throwable es una comprobado Throwable en contraposición a una marcada Exception:

if(obj instanceof Throwable && !(obj instanceof RuntimeException) && !(obj instanceof Error)) { 
    // this is a checked Throwable - i.e. Throwable, but not RuntimeException or Error 
    } 

Si el objeto en cuestión se conoce para que sea una instancia de Throwable (p. fue capturado), solo se necesita la segunda parte del 'si' anterior (por ejemplo, la prueba de Throwable es redundante).

+1

Esto omite las excepciones que heredan de 'Throwable' pero no de' Exception', que se verifican. Generalmente tiene: Una 'excepción' no comprobada t satisfará: 't instanceof Error || t instanceof Exception' Se comprueba todo lo demás que es 'instanceof Throwable'. Un error es un tipo de excepción en el sentido general. – BeeOnRope

+0

@Bee: En cierto sentido eso es bastante correcto; pero, 'Error's son *** Errores ***, no *** Excepciones ***, y Java hace la distinción al nombrar (el manejo 'Error' es otro caso donde la teoría falla en la práctica, pero, pensé, una discusión relacionada pero separada). Es decir, los "errores" también se verifican, pero en la nomenclatura de Java son errores, no excepciones; Sin embargo, tanto los errores como las excepciones son 'Throwable's. Según Java, un 'Error' es un' Throwable' pero no una 'Exception' (más generalmente en inglés,' Error's son "excepciones", pero no son "Exceptions"). –

+1

Exactamente. Dicho esto, supondría que un método que decidiera si un throwable era un check o no sería verdadero para todas las excepciones marcadas, no solo para las excepciones marcadas.Es decir, tomaría el pequeño sentido de la palabra. No puedo ver un caso de uso válido para excluir elementos que extienden 'Throwable' pero no' Exception' o 'Error'. ¿Cómo llamas a esos de todos modos? – BeeOnRope

1

Si la clase de excepción es una subclase de RuntimeException, no está marcada y no tiene que declararse para funciones o captura, etc. Las excepciones Error tampoco tienen que ser declaradas/capturadas. ¿Es eso lo que estás preguntando?

0

Bastante seguro de que esto ha sido preguntado y respondido antes, pero por el bien de él, está cubierto muy bien aquí: http://www.javapractices.com/topic/TopicAction.do?Id=129.

Estrictamente hablando, las excepciones sin marcar siempre se extenderán a RuntimeException mientras que las excepciones marcadas no. El enlace mencionado explica cuándo usar cualquiera.

Como su nombre lo indica, las personas que llaman están obligados a hacer frente a comprobado excepciones, por lo general el manejo de ellos (try/catch) o pasarlos más arriba en la pila. Las excepciones no verificadas generalmente se consideran causadas por elementos que están fuera del control de la persona que llama.

+1

Los errores también estén marcadas, aunque supongo que se podría argumentar que son no excepciones ... –

4

Véase el Java Language Spec, chapter 11:

Las clases de excepciones sin marcar son la clase y sus subclases RuntimeException, y la clase Error y sus subclases. Todas las demás clases de excepción son clases de excepción comprobadas. La API de Java define una serie de clases de excepción, tanto verificadas como no verificadas. Los programadores pueden declarar clases de excepción adicionales, tanto verificadas como no verificadas.

Puede comprobar esto a través de instanceof en tiempo de ejecución, aunque realmente no veo dónde podría ser útil.

En cuanto a la segunda parte de su pregunta:

  • condiciones de error representan espera

    excepción comprobada, lo que puede ocurrir durante la ejecución normal del programa y por lo tanto siempre tiene que ser manejado mediante programación (que hace cumplir el compilador)

  • excepción no comprobada representan condiciones de error inesperadas y significan un estado anormal de su programa, debido a entradas no válidas, errores o restricciones de tiempo de ejecución (por ejemplo, memoria); el compilador no forzará el programador para manejar estos, es decir, sólo tiene que cuidar de ellos si usted sabe de su ocurrencia

+0

@Christoph: y por supuesto hay toda una escuela de programación que considera que "una condición de error esperado" no es realmente un error y que muchos lenguajes funcionan perfectamente incluso sin el * concepto * de la excepción comprobada su existencia es discutible. Joshua Bloch, Java efectivo, * "Prefiere el método de prueba estatal por excepción" *. Y luego, por supuesto, está la escuela de programación que odia a los GOTO y consideró el uso de excepciones comprobadas para el control de flujo como una programación GOTO parecida a un espagueti. No estoy del lado de uno u otro campo, simplemente declaro el estado actual de la aventura :) – SyntaxT3rr0r

-2
package practice; 

import java.io.IOException; 

class Practice 
{ 
    public static void main(String args[]) 
    { 
     Exception n=new NullPointerException(); 
     if(n instanceof RuntimeException) 
     { 
      System.out.println("this is a runtime(unchecked) exception"); 
     } 
     else 
     { 
      System.out.println("this is not a compiletime(checked) exception"); 
     } 

    } 

} 
+0

¿Podría explicarme por qué esto podría funcionar para mejorar su respuesta? – Ben

Cuestiones relacionadas