2

こんにちは、

Java で、次のようなメソッドBufferedReader.read()が an をスローできると言い、2 つの catch ブロックでIOExceptionaFileNotFoundExceptionと anをキャッチしようとするとIOException、ファイルが存在しない場合、どの catch ブロックが入力されますか?

最も具体的なものだけを入力しますか、それとも両方を入力しますか?

4

4 に答える 4

6

例外に一致する最初のコード化されたキャッチが入力されます。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 ブロックによって既に処理されています。

于 2011-07-15T13:02:22.763 に答える
2

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 が認識しているからです。FileNotFoundExceptionIOException

于 2011-07-15T13:04:05.600 に答える
1

そのタイプの例外に適した最初のもの (およびそれだけ)。したがって、catch上記の 2 つの例外タイプをリストした順序で並べると、aFileNotFoundExceptionがキャッチされます。

于 2011-07-15T13:01:47.720 に答える