Javaメソッド宣言でスローを使用するのはいつですか?
-
10-10-2019 - |
質問
だから私はJavaの例外処理についての基本的な理解があると思っていましたが、最近、混乱と疑問を与えてくれたコードを読んでいました。ここで取り組みたいという私の主な疑いは、人が次のようなJavaメソッド宣言でスローする必要がある場合です。
public void method() throws SomeException
{
// method body here
}
いくつかの同様の投稿を読んでから、私はそれを集めます スロー 一種の宣言として使用されます SomeException メソッドの実行中にスローされる可能性があります。
私の混乱は、このように見えたいくつかのコードから来ています:
public void method() throws IOException
{
try
{
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
あなたが使用したい理由はありますか スロー この例では?あなたが単にトライ/キャッチブロックが必要であるというiOExceptionのような何かの基本的な例外処理をしているだけならそうです。
解決
例外タイプをキャッチしている場合は、rethrowしようとしない限り、投げる必要はありません。投稿する例では、開発者は両方ではなく、どちらかを実行する必要があります。
通常、例外を除いて何もしない場合は、キャッチしてはいけません。
あなたができる最も危険なことは、例外をキャッチし、それで何もしないことです。
例外を投げることが適切であるときの良い議論はこちらにあります
他のヒント
メソッドがチェックされた例外をスローする場合、メソッドにスロー条項を含める必要があります。メソッドがランタイム例外をスローする場合、そうする必要はありません。
チェックされたものと未チェックの例外の背景については、こちらをご覧ください。 http://download.oracle.com/javase/tutorial/essenty/exceptions/runtime.html
メソッドが例外をキャッチし、(2番目の例のように)内部的にそれを扱う場合、スロー条項を含める必要はありません。
あなたが見たコードは理想的ではありません。どちらかが必要です:
例外をキャッチし、それを処理します。その場合
throws
不信心です。を削除します
try/catch
;その場合、例外は呼び出し方法によって処理されます。例外をキャッチし、おそらく何らかのアクションを実行してから、例外をreり(メッセージだけでなく)
その例では、あなたは正しいです throws
余分です。以前の実装からそこに残された可能性があります - おそらく、例外は、キャッチブロックに巻き込まれた代わりに、元々投げられたものでした。
あなたが与えた例では、この方法はIOExceptionを投げることは決してないので、宣言は間違っています(ただし、有効です)。私の推測では、元の方法でIOExceptionが投げられましたが、その後、内部の例外を処理するために更新されましたが、宣言は変更されませんでした。
投稿したコードは間違っています。特定の例外をキャッチして、ハンドラーIOExceptionをキャッチするが、キャッチされた例外を投げかけている場合は、例外をスローする必要があります。
何かのようなもの:
public void method() throws Exception{
try{
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
}catch(IOException e){
System.out.println(e.getMessage());
}
}
また
public void method(){
try{
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
}catch(IOException e){
System.out.println("Catching IOException");
System.out.println(e.getMessage());
}catch(Exception e){
System.out.println("Catching any other Exceptions like NullPontException, FileNotFoundExceptioon, etc.");
System.out.println(e.getMessage());
}
}
これは答えではなく、コメントですが、フォーマットされたコードでコメントを書くことができなかったので、コメントがあります。
あるとしましょう
public static void main(String[] args) {
try {
// do nothing or throw a RuntimeException
throw new RuntimeException("test");
} catch (Exception e) {
System.out.println(e.getMessage());
throw e;
}
}
出力はです
test
Exception in thread "main" java.lang.RuntimeException: test
at MyClass.main(MyClass.java:10)
その方法は、「スロー」の例外を宣言するのではなく、それらをスローします!トリックは、スローされた例外が、メソッドで宣言する必要がないruntimeexceptions(未チェック)であることです。彼女が見るのは「スローe」だけだからです。声明ですが、スローの宣言はありません
今、私たちが持っているなら
public static void main(String[] args) throws Exception {
try {
throw new Exception("test");
} catch (Exception e) {
System.out.println(e.getMessage());
throw e;
}
}
メソッドの「スロー」の例外を宣言する必要があります。そうしないと、コンパイラエラーが発生します。