1

私は、何らかの形でキャッチする必要があるあらゆる種類の例外をスローする、非常に誤った JNI を使用しています。(それらのいくつかは、C++ 参照キャスト例外と同じくらい低レベルです!)

私が知りたいのは、すべてをキャッチするという受け入れられている (つまり標準的な) イディオムが Java にあることです。catch (...)C++に似ています。

今まで使ってきた

} catch (java.lang.Exception e){
    ...
}

私はそれが標準だと信じていたので。しかし、少なくとも理論的には、 java.lang.Throwable からクラスを派生させてそれをスローすることが可能であることに気付きました。その場合、実際に使用する必要があります

} catch (java.lang.Throwable e){
    ...
}

ソースコードでそれを見たことがないので、おそらく特異です。あなたたちはそうしますか?

4

7 に答える 7

3

Java でキャッチできるすべてのものをキャッチThrowableしてキャッチすることはできますが、そうすることはめったに良い考えではないことに注意してください。実際には、JVM の通常の操作に干渉する可能性があります。Errorから派生した階層の別の部分である階層は、スタックThrowableオーバーフロー、メモリ不足、破損した .class ファイルなどの非常に重大なエラーに使用されます。それらを捕まえて適切に投げないことは、非常に悪い考えです。

もう一つの問題は、それが不十分であるということです。ネイティブ コードに低レベルのプログラミング エラーがある場合、つまり JNI バリアの向こう側にある場合、プログラムの状態が回復できないほど破損している可能性があり、JVM はこれを正しく認識して例外をスローすることさえできない可能性があります。例外を伝播する能力を超えて破損している可能性があります。

JNI ブリッジを超えたコードに問題がある場合、唯一の現実的な選択肢はそのコードを修正することです。それができない場合 (ソースにアクセスできないなどの理由で)、コードを完全にサンドボックス化する必要があります。ネイティブ コードを使用し、何らかの形で通信できるネイティブ プロセス (stdin/stdout、ネットワークなど) を作成し、Java プログラムからそのプロセスを起動します。プロセスが死んだ場合、プロセスは死にますが、少なくともプログラムを停止することはできません。

于 2013-06-13T11:08:07.013 に答える
0

使用catch(Throwable e) {.. }する方法です。これは、JNI を使用したアプリケーションの 1 つで行ったことです。

于 2013-06-13T11:03:45.883 に答える
0

これはすべてをキャッチするため、Throwable をキャッチするだけです。

Java には 2 つの基本的な例外タイプがあることに注意してください。

  • チェックされる例外
  • ではない RuntimeException
于 2013-06-13T11:03:53.053 に答える
0

独自のカスタム例外を作成し、その例外を使用して例外をスローできます。Throwable はすべての例外の親クラスです。

于 2013-06-13T11:05:07.000 に答える
0

Exceptionのみをキャッチするか、両方Exceptionをキャッチするかによって異なりますError(を使用してThrowable)。

Errorjavadocで述べられているように、おそらくそのようなものをキャッチしたくないでしょうError

于 2013-06-13T11:07:40.460 に答える