2009-07-10 5 views
7

Considere el siguiente códigoExcepciones no facturado

private int meth() 
{ 
    try 
    { 
     return 1; 
    } 
    catch(Exception ex) 
    { 
     return 2; 
    } 
    finally 
    { 
     return 3; 
    } 
} 

Cuando se compila el código aforeseen, "excepción" se trata como excepción sin marcar. Es decir "bloque catch inalcanzable Excepción Nunca se lanza en bloque try" error de compilación no occur.Consider estoy declarando mi propia excepción,

class MyException extends Exception 
{ 
} 

y su uso en el código

private int meth() 
{ 
    try 
    { 
     return 1; 
    } 
    catch(MyException me) 
    { 
     return 2; 
    } 
    finally 
    { 
     return 3; 
    } 
} 

En este "El bloque catch inalcanzable MyException nunca se arroja en el bloque try" se produce un error de compilación. ¿Por qué en el primer escenario "Excepción" se trata como RuntimeException y en el segundo escenario, aunque "MiExcepción" es una subclase de "Excepción", se trata como excepción comprobada. ¿Puede alguien ayudarme a resolver este problema?

Respuesta

4

Por lo que el compilador sabe, en cualquier momento podría obtener una excepción de desbordamiento de pila, excepción de falta de memoria, excepción aritmética o cualquier cantidad de otras excepciones generadas por JVM. Por otro lado, puede analizar estáticamente ese bloque try y ver que MyException nunca se lanza, por lo que levanta las manos. Sabe que nunca será arrojado por la JVM.

+0

Esa sería mi suposición, porque trata las excepciones de JVM como Excepción de que se puede lanzar, pero sabe que no se puede lanzar una excepción definida por el usuario a menos que haya una llamada "throw" en cualquier parte del intento. – nlaq

12

El motivo de este comportamiento es que las únicas excepciones no verificadas en el lenguaje Java son RuntimeException y sus subclases. Todas las demás excepciones y errores, incluido el suyo, ya que solo se subclasifican Exception (y no RuntimeException), son excepciones marcadas.

El motivo por el que el compilador no marca el primer ejemplo de código, aunque utiliza la clase Exception como su instrucción catch, se debe a la jerarquía de clases. Dado que todas las excepciones se derivan de Excepción, su código no está capturando Excepción específicamente, pero detecta todas las excepciones y las envía a una instancia de Excepción. Por lo tanto, no hay forma de que el compilador diga si la excepción que será capturada en el tiempo de ejecución es una excepción marcada o no. En el segundo bloque de código, no hay forma de que la excepción capturada no sea una excepción comprobada, por lo tanto, el compilador puede determinar que su bloque catch no está disponible.

+0

De hecho, una mejor respuesta. +1 –

+0

+1 - Iba a escribir eso ... mire la jerarquía de herencia de excepciones ... está todo allí :-) – Newtopian

1

En Java, las excepciones sin marcar (RuntimeExceptions) y comprobadas derivan de Excepción.

En su ejemplo, en el primer caso, el bloque catch puede ya sea un retén RuintimeException (obtener beneficio de la duda aquí) o cualquier excepción revisada y por lo tanto no se quejan de la excepción no se detecta.

Sin embargo, en el segundo caso, ya que ha mencionado explícitamente un tipo de excepción que está marcado y que no se incluye en ninguna parte de su código, da error. Este bloque catch no es aplicable para las excepciones RTE. En este caso particular, no obtiene el beneficio de la duda que el compilador tenía en su primer escenario.