こんにちは、
Java で、次のようなメソッドBufferedReader.read()
が an をスローできると言い、2 つの catch ブロックでIOException
aFileNotFoundException
と anをキャッチしようとするとIOException
、ファイルが存在しない場合、どの catch ブロックが入力されますか?
最も具体的なものだけを入力しますか、それとも両方を入力しますか?
こんにちは、
Java で、次のようなメソッドBufferedReader.read()
が an をスローできると言い、2 つの catch ブロックでIOException
aFileNotFoundException
と anをキャッチしようとするとIOException
、ファイルが存在しない場合、どの catch ブロックが入力されますか?
最も具体的なものだけを入力しますか、それとも両方を入力しますか?
例外に一致する最初のコード化されたキャッチが入力されます。Azodius からのコメントを組み込むために
編集
例えば:
try {
bufferedReader.read();
} catch (FileNotFoundException e) {
// FileNotFoundException handled here
} catch (IOException e) {
// Other IOExceptions handled here
}
次のコードはコンパイルされません。
try {
bufferedReader.read();
} catch (IOException e) {
// All IOExceptions (and of course subclasses of IOException) handled here
} catch (FileNotFoundException e) {
// Would never enter this block, because FileNotFoundException is a IOException
}
コンパイラ メッセージは次のように述べています。
FileNotFoundException の到達不能な catch ブロック。IOException の catch ブロックによって既に処理されています。
catch ブロックの例外の型がスローされる例外の型と一致する最初の catch ブロックのみが実行されます (より具体的には、実行される最初の catch ブロック(e instaceof <exception type>)==true
)。他の catch ブロックは実行されません。
例えば
try{
BufferedReader.read();
}
catch(FileNotFoundException e){System.out.println("FileNotFoundException");}
catch(IOException e){System.out.println("IOException");}
をスローすると出力FileNotFoundException
されます。BufferedReader.read()
FileNotFoundException
以下は実際にはコンパイルされないことに注意してください。
try{
BufferedReader.read();
}
catch(IOException e){System.out.println("IOException");}
catch(FileNotFoundException e){System.out.println("FileNotFoundException");}
すべての s もs であるため、FileNotFoundException
をキャッチすることは不可能であることを Java が認識しているからです。FileNotFoundException
IOException
そのタイプの例外に適した最初のもの (およびそれだけ)。したがって、catch
上記の 2 つの例外タイプをリストした順序で並べると、aFileNotFoundException
がキャッチされます。