2011-12-08 11 views
8

Aquí hay un ejemplo que muestra el comportamiento contrario de la clase 'Excepción' de Java.¿Está marcada la clase de excepción java?

Try 
{ 
} 
catch(Exception ex) 
{ 
} 

En el caso del tipo comprobada de excepción, si mantenemos un bloque catch sin ningún error comunicado provocando a la excepción comprobada en particular en bloque try a continuación, el compilador generará un error como “Esta excepción no se lanza desde la intentar cuerpo de declaración ". Pero en el caso anterior el compilador no dará ningún error.

Por otro lado, si elevamos una excepción de tipo de clase 'excepción' mediante el uso de un tiro palabra clave, la excepción no será agacharon automáticamente a la persona que llama, como a continuación

throw new Exception(); 

En caso compilador anteriormente da error como "Excepción de tipo excepción no controlada".

Entonces, ¿la clase de excepción java está marcada tipo o no marcada?

Gracias Raj.

+0

Para su información, la clase secundaria de Throwable está marcada y los subtítulos de RuntimeException y Error no lo son. Puede subclase Throwable y no tener un error o excepción. –

Respuesta

1

cosas que debe saber sobre Excepciones:

  • Exceptions son comprobado, lo que significa que si se declara como throws, deben ser manejados (atrapado). Aproximadamente, estos son para "errores de no programación". por ejemplo IOException
  • RuntimeExceptions (una subclase de Exception) son sin control, lo que significa que no tienen que ser manejados si se declara, y puede ser lanzado cuando no declarado. Aproximadamente, estos son para "errores de programación". por ejemplo, NullPointerException
  • Errors están desmarcados, pero no son Exceptions (ver a continuación). Estos son para errores "irrecuperables". por ejemplo OutOfMemoryError
  • Throwable es la clase padre abstracta de todo lo anterior

Prueba esto:

try { 
    .... 
} catch (RuntimeException e) { 
    .... 
} 

o si usted está esperando tanto tiempo de ejecución y no en tiempo de ejecución excepciones:

try { 
    .... 
} catch (Throwable e) { 
    .... 
} 
8

Exceptiones a excepción comprobada. De section 11.2 of the JLS:

Las clases de excepciones sin marcar son los RuntimeException clase y sus subclases, y el error de la clase y sus subclases. Todas las demás clases de excepción son clases de excepción comprobadas.

Sin embargo, el comportamiento que se está viendo en torno a ser capaz de atraparlo sin nada en el bloque try que se declara a tirar nada se debe a section 14.20 of the JLS:

es un error de tiempo de compilación si una cláusula catch capturas revisados ​​tipo de excepción E1, pero no existe ningún tipo de excepción comprobada E2 de tal manera que todos los siguientes retención:

  • < E2: E1
  • El bloque try correspondiente a la cláusula catch puede lanzar E2
  • Sin bloque catch precedente de la sentencia try inmediatamente circundante atrapa E2 o un supertipo de E2.

menos que E1 es la excepción clase.

La razón de esto es RuntimeException, que es una excepción sin control subclase de Exception. Así que a diferencia de todas las demás excepciones comprobadas, es posible que catch (Exception) para detectar una excepción sin control, que se puede ver (en un modelo simplificado) como potencialmente lanzada por cualquier try bloque. Básicamente RuntimeException entra en conflicto con la jerarquía de excepciones :(

2

RuntimeException, Error y sus subclases son excepciones no marcadas. Se descartan todas las superclases incluidas. Naturalmente, como las excepciones comprobadas pueden ser subclase de Excepción, debe verificarse ..

0

Jon Skeet estaba cerca, pero no lo consiguió exactamente ... no explicó la declaración throw Su respuesta a que se encuentra en la sección 14.18 - The throw Statement de la especificación del lenguaje Java, específicamente:

La expresión en una declaración throw debe denotar una variable o va lue of un tipo de referencia que se puede asignar (§5.2) al tipo Throwable, o , se produce un error en tiempo de compilación. Además, al menos una de las siguientes tres condiciones deben ser verdad, o se produce un error de tiempo de compilación:

  • La excepción no es una excepción comprobada (§11.2), específicamente, una de las siguientes situaciones es true:
    • El tipo de Expression es la clase clase RuntimeException o una subclase de RuntimeException.
    • El tipo de la expresión es el Error clase o una subclase de Error.
  • El tiro declaración está contenida en el bloque try de una sentencia try (§14.20) y el tipo de la expresión es asignable (§ 5.2) para el tipo del parámetro de al menos una cláusula catch de la declaración try. (En este caso , decimos que el valor arrojado es captado por la declaración try.)
  • La declaración tiro está contenida en un método o constructor declaración y el tipo de la expresión es asignable (§ 5.2) a por lo menos un tipo enumerado en la cláusula throws (§8.4.6, §8.8.5) de la declaración.

Usted está lanzando una Exception, que no es un RuntimeException o sublcass de RuntimeException. Ninguna de las otras condiciones se aplica tampoco.

Para verificar esto, arroje un new RuntimeException() y vea si el compilador se queja.

0

Excepción comprobada La excepción que comprueba el compilador Java para la ejecución sin problemas del programa en el tiempo de ejecución se llama Excepción comprobada.

  1. totalmente excepción revisada excepción comprobada está dispuesto a ser totalmente verificados si y sólo si todas sus clases hijas son por ejemplo checked.for IOException, etc. InterruptedException

  2. parcialmente excepción revisada Una excepción comprobada está listo para ser revisado en parte si y sólo si algunos de sus clases hijas estén marcadas. En toda jerarquía de excepciones excepción sólo parcialmente comprobado son Excepción y Throwable

excepción no comprobada La excepción que no son criados por el compilador de Java si plantea o no una excepción son llamados excepción no comprobada.

Nota:La clase de excepción no está marcada ni Excepción no marcada. Es una excepción parcialmente controlada.

Cuestiones relacionadas