Обычно компилятор Java подтверждает, что все выбрасываемые проверенные исключения находятся в спецификации throw. Происходит ли что-то особенное, когда нативная функция выдает проверенное исключение java, которого нет в списке спецификаций бросков функций, или список спецификаций бросков просто игнорируется во время выполнения?
С++
void function(JNIEnv * env, jclass jc) {
jclass newExcCls = env->FindClass("java/lang/NullPointerException");
env->ThrowNew(newExcCls, "ERROR");
}
Ява
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();
}
}
}
(Имя функции C++, вероятно, будет искажено. Также loadLibrary должен быть в попытке поймать. Неважно, я не верю, что это имеет отношение к проблеме. Возможно, в коде есть и другие ошибки, но они, вероятно, тоже не имеют значения.)