3

同じチェック済み例外を複数回宣言するメソッドを記述できることに気付きました。

public void myMethod() throws MyException, MyException, MyException {

これをやりたい理由が思い浮かびません。私はしばらく探していましたが、なぜこれが受け入れられるのか、またはどのように良いのかを説明するリソースがあるかどうかを見つけることができません. 誰でもこれに関するリソースを教えてもらえますか?

4

2 に答える 2

4

throwsJLS には、節で同じ例外タイプ (またはサブタイプでさえも) を指定することを妨げるものは何もありません。JLS のセクション 8.4.6によると、唯一の制限は次のとおりです。

句で言及されているExceptionTypethrowsが のサブタイプ (§4.10) でない場合、コンパイル時エラーになりますThrowable

したがって、これはコンパイルされます:

throws RedundantException, RedundantException, RedundantException

私の IDE は「重複したスロー」について警告しますが、これはコンパイラ エラーではありません。

これを行う正当な理由はありません。これを試みることさえ私には思い浮かびませんでした。

MySubclassExceptionサブクラスであっても、これはコンパイルされますMyException:

throws MyException, MySubclassException, MyException, MySubclassException

サブクラスの例外タイプをthrows句にリストする唯一の理由は、サブクラスがスローされる可能性があることを独自の Javadoc に文書化して、個別に処理できるようにすることです。

@throws MyException If something general went wrong.
@throws MySubclassException If something specific went wrong.

それでも、私の IDE は、リストにある「より一般的な例外」について警告します。

ちなみに、上記の例の例外タイプがチェックされているかどうかは問題ではないようです。

于 2015-02-03T21:35:29.100 に答える
1

rgettman の回答で述べたように、重複したthrows宣言には意味的な意味はありません。ただし、javac次の例に示すように、それらをコンパイル済みのクラス ファイルに記録し、リフレクションで使用できるようにします。

public class Main {
    public static void main(String[] args) throws IOException, IOException,
            IOException, NoSuchMethodException {
        Arrays.stream(Main.class.getMethod("main", String[].class).getExceptionTypes())
                .forEachOrdered(System.out::println);
    }
}

印刷する

class java.io.IOException
class java.io.IOException
class java.io.IOException
class java.lang.NoSuchMethodException

これは有用ではありません (そしておそらく のバグのあるコンシューマを公開します) が、重複した宣言Method.getExceptionTypes()によって引き起こされる動作の違いです。throws

于 2015-02-03T21:47:21.823 に答える