同じチェック済み例外を複数回宣言するメソッドを記述できることに気付きました。
public void myMethod() throws MyException, MyException, MyException {
これをやりたい理由が思い浮かびません。私はしばらく探していましたが、なぜこれが受け入れられるのか、またはどのように良いのかを説明するリソースがあるかどうかを見つけることができません. 誰でもこれに関するリソースを教えてもらえますか?
同じチェック済み例外を複数回宣言するメソッドを記述できることに気付きました。
public void myMethod() throws MyException, MyException, MyException {
これをやりたい理由が思い浮かびません。私はしばらく探していましたが、なぜこれが受け入れられるのか、またはどのように良いのかを説明するリソースがあるかどうかを見つけることができません. 誰でもこれに関するリソースを教えてもらえますか?
throws
JLS には、節で同じ例外タイプ (またはサブタイプでさえも) を指定することを妨げるものは何もありません。JLS のセクション 8.4.6によると、唯一の制限は次のとおりです。
句で言及されているExceptionType
throws
が のサブタイプ (§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 は、リストにある「より一般的な例外」について警告します。
ちなみに、上記の例の例外タイプがチェックされているかどうかは問題ではないようです。
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