10

通常,Java 编译器确认所有抛出的检查异常都在 throw 规范中。当本机函数抛出不在函数抛出规范列表中的 java 检查异常时,是否会发生任何特殊情况,或者抛出规范列表是否在运行时被简单地忽略?

C++

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 也应该在 try catch 中。不要在意,我不相信它与问题有关。代码中可能还有其他错误,但它们可能不相关任何一个。)

4

1 回答 1

5

您甚至不必求助于本机代码来欺骗检查异常机制。请参阅Thread.stop(Throwable) 上的 Javadoc。我曾经一整天都在想我InterruptedException的代码是如何在没有声明它的代码中间抛出一个。那时我什至没有找到答案,但现在我知道了:)

回答您的直接问题:是的,检查的异常逻辑是仅编译器的功能,在运行时被忽略。

于 2012-08-01T19:57:29.973 回答