Normalerweise bestätigt der Java-Compiler, dass alle geprüften Ausnahmen, die geworfen werden, in der throw-Spezifikation enthalten sind. Passiert etwas Besonderes, wenn eine native Funktion eine geprüfte Java-Ausnahme auslöst, die nicht in der throw-Spezifikationsliste der Funktion enthalten ist, oder wird die throw-Spezifikationsliste zur Laufzeit einfach ignoriert?
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();
}
}
}
(Der C++-Funktionsname würde wahrscheinlich verstümmelt werden. Auch loadLibrary sollte in einem try catch stehen. Ist mir egal, ich glaube nicht, dass es für das Problem relevant ist. Es gibt möglicherweise andere Fehler im Code, aber die sind wahrscheinlich auch nicht relevant).