2

私は現在、Windows、Linux、および MacOS X でうまく動作する Java のクロスプラットフォーム アプリケーションに取り組んでいます。Java で「クラッシュ」を検出し、それに応じて何かを行う簡単なクロスプラットフォームの方法はありますか?

「クラッシュ」とは、キャッチされていない例外を意味すると思います。ただし、コードは一部の JNI を使用しているため、不適切な JNI コードからのクラッシュを検出できると便利ですが、それは JVM 固有のものだと感じています。

4

3 に答える 3

4

単純なキャッチオール処理の場合、Threadで次の静的メソッドを使用できます。Javadoc から:

static void setDefaultUncaughtExceptionHandler ( Thread.UncaughtExceptionHandler eh)
          キャッチされない例外が原因でスレッドが突然終了し、そのスレッドに対して他のハンドラーが定義されていない場合に呼び出されるデフォルトのハンドラーを設定します。

これは、他の場所ではキャッチできない可能性があるエラーまたは未チェックの例外を処理するための非常に広範な方法です。

補足:コードが問題の原因に近い例外をキャッチ、ログ記録、および/または回復できるとよいでしょう。この種の一般化されたクラッシュ処理は、完全に回復不可能な状況 (つまり、java.lang.Errorのサブクラス) 用に取っておきます。ソフトウェアがそれを生き残ることが可能であり、望ましい場合があるため、 RuntimeExceptionが完全にキャッチされない可能性を回避するようにしてください。

于 2008-09-15T02:38:16.013 に答える
3

キャッチされなかった例外を処理するために、ThreadGroup.uncaughtException(...) の実装を提供する新しい ThreadGroup を提供できます。その後、キャッチされなかった例外をキャッチし、適切に処理できます (たとえば、クラッシュ ログをホームに送信します)。

JNI の面ではお手伝いできません。おそらく、JVM を呼び出す前にネイティブ ラッパー実行可能ファイルを使用する方法がありますが、その実行可能ファイルは、呼び出す可能性のあるすべての JVM と、指示がクラッシュする方法と場所について知る必要があります。クラッシュログなどが置かれています。

于 2008-09-14T23:12:13.310 に答える
1

これが必要かどうかはわかりませんが、ネイティブ コード内から例外が発生したかどうかを検出することもできます。詳細については、 http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp5234を参照してください。

于 2008-09-14T23:18:10.177 に答える