51

でキャッチされない Java の例外があるのはなぜcatch (Exception ex)ですか? これは、未処理の例外でコードが完全に失敗することです。(Java バージョン 1.4)。

public static void main(String[] args) {
    try {
        //Code ...
    } catch (Exception ex) {
        System.err.println("Caught Exception");
        ex.printStackTrace();
        exitCode = app.FAILURE_EXIT_CODE;
    }
    finally {
        app.shutdown();
    }
    System.exit(exitCode);
}

私はException in thread "main" java.lang.NoSuchMethodError

しかし、これは機能します

public static void main(String[] args) {
    int exitCode = app.SUCCESS_EXIT_CODE;
    try {
        //Code ...
    } catch (java.lang.NoSuchMethodError mex){
        System.err.println("Caught NoSuchMethodError");
        mex.printStackTrace();
        exitCode = app.FAILURE_EXIT_CODE;
    } catch (Exception ex) {
        System.err.println("Caught Exception");
        ex.printStackTrace();
        exitCode = app.FAILURE_EXIT_CODE;
    }
    finally {
        app.shutdown();
    }
    System.exit(exitCode);
}

私は得るCaught NoSuchMethodError java.lang.NoSuchMethodError:

例外をキャッチするとすべての例外がキャッチされると思いましたか? Javaですべての例外をキャッチするにはどうすればよいですか?

4

7 に答える 7

135

Exception一部の例外は、たとえばThrowableおよびから派生しないためErrorです。

基本的に型階層は次のとおりです。

       Object
         |
      Throwable
     /         \
Exception      Error

および派生クラスのみThrowablesをスローできるため、 をキャッチThrowableすると、実際にはすべてがキャッチされます。

ThrowableExceptionおよびから派生したもの以外Exception から派生した例外は、チェックされた例外RuntimeExceptionとしてカウントされます。それらは、スローすることを宣言するか、それらをスローするものを呼び出した場合はキャッチする必要があるものです。

全体として、Java 例外階層は少し混乱しています...

于 2009-09-03T18:27:10.613 に答える
6

Errors ではありませんException

クラス Exception とそのサブクラスは、適切なアプリケーションがキャッチする可能性がある条件を示す Throwable の形式です。

-- java.lang.Exception の JavaDoc

Error は、Throwable のサブクラスであり、合理的なアプリケーションがキャッチしようとすべきではない重大な問題を示します。

-- java.lang.Error の JavaDoc

ThreadDeathなど、キャッチしたい特定のエラーがあります。以下で説明するように、ThreadDeath はエラーとして分類されます。

クラス ThreadDeath は、多くのアプリケーションが Exception のすべての発生をキャッチしてから例外を破棄するため、「通常の発生」であっても、具体的には Exception ではなく Error のサブクラスです。

-- ThreadDeath の JavaDoc

ただし、Thread の stop() メソッドは廃止されたため、使用しないでください。したがって、ThreadDeath が表示されることはありません。

于 2009-09-03T18:37:01.807 に答える
4

例外は、Throwable の 1 種類にすぎません。NoSuchMethodError は Exception ではなく、別の種類の Throwable である Error です。

于 2009-09-03T18:27:55.870 に答える
3

あなたがキャッチすることができThrowableます。エラーと例外は拡張されThrowableます。

Throwable JavaDocを参照してください。

Throwable クラスは、Java 言語のすべてのエラーと例外のスーパークラスです。

于 2009-09-03T18:27:39.287 に答える
1

他のポスターが指摘しているように、すべてのスロー可能なオブジェクトが のサブクラスであるとは限りませんException。ただし、ほとんどの状況では、Errorまたはをキャッチすることはお勧めThrowableできません。これらの状態には、簡単に回復できない非常に深刻なエラー状態が含まれているためです。あなたの回復コードは事態を悪化させるだけかもしれません。

于 2009-09-03T18:31:32.710 に答える
0

他の両方の投稿が指摘しているように、 catch(Exception e) はExceptionから派生した例外に対してのみ機能します。ただし、ツリー階層を見ると、 Exception if Throwableに気付くでしょう。また、Throwable はErrorの基本クラスでもあります。そのため、NoSuchMethodError の場合はエラーであり、例外ではありません。*Error と *Exception の命名規則に注意してください (IOException など)。

于 2009-09-03T18:30:58.047 に答える