2012-08-01 14 views
10

通常、Javaコンパイラは、スローされたすべてのチェック例外がスロー仕様にあることを確認します。ネイティブ関数が、関数のスロー指定リストになかったJavaチェック例外をスローするとき、または実行時に単にスロー指定リストが無視されるときに特別なことが起こるか?関数のスロー指定にJavaチェック例外がありませんか?

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(); 
     }   
    } 
} 

(C++関数名はおそらく台無しされるだろう。また、LoadLibrary関数は、トライキャッチでなければなりません。気にしないでください、私はそれがだとは思いません問題に関連する。そこコード内の他のエラーはおそらくだが、彼らはどちらかおそらく関係ありませんね。)

+0

私はちょっと重複していないことに驚いています。 –

答えて

5

あなたも、チェック例外をだますためにネイティブコードに頼る必要はありませんmechanis m。 Javadoc on Thread.stop(Throwable)を参照してください。かつて私のコードが宣言していないコードの真ん中にInterruptedExceptionを投げ込んだのは一日中不思議でした。私もその後、答えを見つけられませんでしたが、今私はあなたの即時の質問に答える:)

知っている:はい、チェック例外ロジックは、コンパイラのみの機能と、実行時に無視されています。

+0

あなたがリンクしている関数は、私が見ることができる限り未チェックの例外をスローするだけなので、大きな例ではありません。スロー指定リストにある必要はありません。 –

+0

次の文を読んでから、「このスレッドが表すスレッドは、異常終了したことを何でも完了し、Throwableオブジェクトobjを例外としてスローするように強制されます。 –

+0

ああ、その場違いを逃した、私はExceptionクラスの名前を探していた。興味深い発見。 –

関連する問題