2012-08-01 10 views
10

Normalmente, el compilador de Java confirma que todas las excepciones marcadas que se lanzan están en la especificación throw. ¿Hay algo especial que ocurra cuando una función nativa arroja una excepción java checked que no estaba en la lista de especificación de lanzamiento de funciones, o la lista de especificaciones de tiro simplemente se ignora en el tiempo de ejecución?¿Excepción marcada Java no en la especificación de lanzamiento de la función?

C++

void function(JNIEnv * env, jclass jc) { 
    jclass newExcCls = env->FindClass("java/lang/NullPointerException"); 
    env->ThrowNew(newExcCls, "ERROR"); 
} 

Java

public class Tester { 
    static { 
     System.loadLibrary("MyLibrary"); 
    }   
    private static native void function(); 
    public static void main(String [ ] args) { 
     try { 
      function(); 
     } catch(Exception e) { //is it caught? Or what happens? 
      e.printStackTrace(); 
     }   
    } 
} 

(La ++ nombre de función C probablemente sería destrozado. También loadLibrary debe estar en un intento de captura. No importa, no creo que es relevante para el problema. Posiblemente haya otros errores en el código, pero probablemente tampoco sean relevantes).

+0

Estoy un poco sorprendido de que este no sea un duplicado. –

Respuesta

5

Ni siquiera tiene que recurrir al código nativo para engañar al mecanismo de excepción comprobado metro. Vea el Javadoc on Thread.stop(Throwable). Una vez me quedé pensando todo el día cómo mi código arrojó un InterruptedException en el medio del código que no lo declaró. Ni siquiera encontré la respuesta, pero ahora sé :)

Respondiendo a su pregunta inmediata: sí, la lógica de excepción comprobada es una característica de solo compilación e ignorada en tiempo de ejecución.

+0

La función que vinculó no es un gran ejemplo, ya que solo arroja excepciones no comprobadas por lo que puedo ver, que no tienen que estar en la lista de especificación de tiro. –

+0

Lea la siguiente oración, luego: "El hilo representado por este hilo se ve obligado a completar lo que está haciendo de forma anormal y a arrojar el Objeto Throwable obj como una excepción". –

+0

Oh, eché de menos esa frase, estaba buscando los nombres de las clases de Exception. Hallazgo interesante –

Cuestiones relacionadas