3

method1に例外をスローする例外をスローするmethod2例外チェーンがありmainます。何らかの理由で、コンパイラはエラーを処理するように強制し、処理しmethod2ない場合はエラーとしてマークし、チェックされた例外であることを示します。しかし、同じExceptionことが行のさらに下にスローされるmainと、コンパイラはそれを無視することを許可し、エラーを表示しません。

の元の例外method1は、ParseExceptionチェックされる です。しかし、メソッドthrows Exceptionにはヘッダーにジェネリック句があり、同じオブジェクトが同一の句を持つ method2 にスローされますthrows Exception。この例外は、コンパイラによってチェック/キャッチされた状態をいつ、どのように失いますか?

明確にするために編集:

public void method1() throws Exception{
   // code that may generate ParseException
}

public void method2() throws Exception{
   method1(); //compiler error (if the throws clause is left out)
}

public static void main(String[] args){
   method2(); //ignored by compiler, even though the exception isn't caught or thrown or handled at all
}

編集: 申し訳ありませんが、質問は間違いに基づいていました... main メソッドには、実際throws Exceptionには欠落している節がありました。それを削除したところ、コードは期待どおりに動作するようになりました。助けてくれてありがとう!

4

4 に答える 4

6

例外がチェックされるかどうかは、例外の種類に完全に依存します。それがRuntimeExceptionまたはそのサブクラスである場合、チェックされません。そうでなければ、そうです。(そして、はい、RuntimeExceptionのサブクラスですException — Java ライブラリ設計の失敗の 1 つですが、最も大きな失敗ではありません。)

コンパイラがチェックするのは、メソッド シグネチャです。したがって、スローされる実際の例外は無関係です (この目的では)。メソッドが言う場合は、メソッドthrows ExceptionをキャッチExceptionするか、メソッドを宣言する必要がありますthrows Exception。メソッドは常に可能な限り狭い throws句を使用する必要があります。たとえば、not throws Exception butthrows ParseExceptionなどです。

(もちろん、コンパイラが行う他のthrowsことの1つは、句でカバーされていないチェック済み例外をスローしないことを確認するため、「(この目的には)無関係」と言います。)

編集 編集で追加したコードはコンパイルされません: 1. インスタンスなしでインスタンス メソッドを呼び出しており、2 .mainをスローすることを宣言する必要がありますException

このコードは他の問題を解決し、節がmain必要であることを (正しく) 示しています。throws Exception

public class CheckTest
{
    public static final void main(String[] params)
    {
        new CheckTest().method2();
    }

    public void method1() throws Exception{
        throw new java.text.ParseException("foo", 2);
    }

    public void method2() throws Exception{
        this.method1();
    }
}

結果:

CheckTest.java:27: unreported exception java.lang.Exception; must be caught or declared to be thrown

                new CheckTest().method2();
                                       ^
1 error
于 2010-05-06T14:38:17.297 に答える
3

チェック済み例外は、チェック済み例外であることに変わりはありません。チェックされた例外をチェックされていないものに変える方法は、タイプの RuntimeException 内にラップして再スローすることです。

于 2010-05-06T14:35:33.340 に答える
2

あなたの場合、コールスタックのルートまでExceptionずっと sになります。メソッドがスローするように宣言されている場合Exception(メソッドが行うことはめったにありません)、呼び出し元のメソッドは、それもスローすると宣言するかException、それをキャッチして処理する必要があります。

編集編集されたOPの例と同様に、それはコンパイルされません。ただし、処理したくない場合はmain、スローを宣言できます。Exception

于 2010-05-06T14:38:39.287 に答える
0

コンパイラが問題に遭遇し、その時点で構文のチェックを停止するmain()ため、コンパイラが問題について不平を言っていない可能性はありますか? method2()どちらもエラーになるはずです。呼び出しを修正しmethod2()、クリーンなコンパイルを取得しましたか?

于 2010-05-06T14:38:43.577 に答える