10

通常、Java コンパイラは、スローされるすべてのチェック例外がスロー仕様に含まれていることを確認します。ネイティブ関数が、関数のスロー仕様リストにない 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 キャッチに含まれている必要があります。気にしないでください。問題に関連しているとは思いません。コードに他のエラーがある可能性がありますが、おそらく関連性はありませんまた。)

4

1 に答える 1

5

チェック例外メカニズムをだますためにネイティブ コードに頼る必要さえありません。Thread.stop(Throwable)の Javadoc を参照してください。私はかつて、自分のコードInterruptedExceptionがそれを宣言していないコードの途中でどのようにスローしたのか、一日中疑問に思っていました。当時は答えさえ見つけられませんでしたが、今ではわかります:)

あなたの当面の質問に答える: はい、チェックされた例外ロジックはコンパイラのみの機能であり、実行時に無視されます。

于 2012-08-01T19:57:29.973 に答える