Проверено ли исключение Java не в спецификации функции throw?
Обычно компилятор Java подтверждает, что все проверенные исключения, которые выбрасываются, находятся в спецификации throw. Делает ли что-нибудь особенное, когда родная функция выбрасывает исключение с проверкой java, которое не было в списке спецификаций throw throw, или же список спецификаций throw просто игнорируется во время выполнения?
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();
}
}
}
(Название функции С++, вероятно, будет искажено. Также loadLibrary должен быть в try catch. Не волнует, я не считаю, что это относится к проблеме. Возможно, в коде есть другие ошибки, но они вероятно, не имеет значения.)
Ответы
Ответ 1
Вам даже не нужно прибегать к собственному коду, чтобы обмануть проверенный механизм исключения. См. Javadoc на Thread.stop(Throwable). Я когда-то забывал весь день, как мой код бросил InterruptedException
в середине кода, который не объявлял его. Тогда я даже не нашел ответа, но теперь я знаю:)
Отвечая на ваш вопрос: да, проверенная логика исключений является функцией только для компилятора и игнорируется во время выполнения.