7

一連のタスクを実行する Java ライブラリがあります。そして、次を使用して、デフォルトのキャッチされていない例外ハンドラーを登録しました。

Thread.setDefaultUncaughtExceptionHandler(new JavaUncaughtExceptionHandler());

UncaughtExceptionHandler が実装されUncaughtExceptionHandler、エラー情報のみが に記録されSTDERRます。

私のJavaライブラリはC++コードからJNIを介して呼び出され、JNIはそれを呼び出しておりExceptionCheck()、C++でFATALとしてエラーをログに記録しています。

問題は:

実行時にRuntimeException、Java コードで (またはその他のキャッチされない例外) が発生すると、JavaUncaughtExceptionHandlerスレッドのデフォルトのキャッチされない例外ハンドラーとして登録されている代わりに、C++ でエラーがキャプチャされます。

  1. それは例外的な動作ですか?
  2. DefaultUncaughtExceptionHandler実際に呼び出されるのはいつですか?スレッドがシャットダウンする前に知っていますが、具体的には JNI の場合です。C++ に戻る前に呼び出されるか、C++ コードが終了した後にも呼び出されます)。JNIのスレッド管理に関係していると思いますので、関連情報も教えてください。
  3. とにかく、Javaコードですべての例外をキャッチできますか( try/catchブロックを置く以外の別の方法)

本当にありがとう。

4

1 に答える 1

1

Java Invocation APIについて話しているように聞こえます(つまり、呼び出しが逆方向に行われる単純な JNI とは対照的に、C++ プログラム内から Java メソッドを呼び出しています)。

私は専門家ではありませんが、Java Invocation API を扱ったことがあります。

私の知る限り、キャッチされていない例外ハンドラは、Java スレッドのrun()メソッドによって例外がスローされたときにのみ呼び出されます。しかし、C/C++ コードによって作成されたスレッドにはメソッドがありませんrun()

私は C++ ではなく C を書いたので、Java への呼び出しはすべて次のようになりました。

jobject return_value = (*env)->CallObjectMethod(env, instance, method_id, ...);

Cから呼び出すと必ずリターンしますが、 を使う前にreturn_value、メソッドが正常にリターンしたか、例外をスローしたかを確認する必要があります。

例外がスローされた場合、例外が「キャッチされない」ことはありません。C コードが呼び出されない(*env)->ExceptionClear(env)場合 (つまり、C コードが例外を「キャッチ」しない場合)、何を覚えていません。起こりますが、私はそれが良いとは思いません。

于 2016-08-24T17:19:22.900 に答える