开发者

Java catching exceptions and subclases

开发者 https://www.devze.com 2023-03-20 08:36 出处:网络
Hello, In Java if a method like BufferedReader.read() says it can throw an IOException and I try to catch a FileNotFoundException and a开发者_JAVA百科n IOException in two catch blocks, what catch blo

Hello,

In Java if a method like BufferedReader.read() says it can throw an IOException and I try to catch a FileNotFoundException and a开发者_JAVA百科n IOException in two catch blocks, what catch blocks will be entered if the file doesn't exist?

Does it enter only the most specific or both?


The first coded catch that matches the exception will be entered.
Edited to incorporate comment from Azodius

For example:

try {
   bufferedReader.read();
} catch (FileNotFoundException e) {
   // FileNotFoundException handled here
} catch (IOException e) {
   // Other IOExceptions handled here
}

This following code does not compile:

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
}

Compiler message says:

Unreachable catch block for FileNotFoundException. It is already handled by the catch block for IOException


Only the first catch block encountered where the exception type of the catch block matches the type of the exception being thrown will be run (more specifically, the first catch block where (e instaceof <exception type>)==true will be run). None of the other catch blocks will be run.

For example

try{
    BufferedReader.read();
}
catch(FileNotFoundException e){System.out.println("FileNotFoundException");}
catch(IOException e){System.out.println("IOException");}

Will print FileNotFoundException if BufferedReader.read() throws a FileNotFoundException.

Note that the following doesn't actually compile:

try{
    BufferedReader.read();
}
catch(IOException e){System.out.println("IOException");}
catch(FileNotFoundException e){System.out.println("FileNotFoundException");}

because Java realizes that it is not possible for the FileNotFoundException to be caught because all FileNotFoundExceptions are also IOExceptions.


The first one which is suitable for that type of exception (and only that). So if you catch the two exception types above in the order you list them, a FileNotFoundException will be caught.


Specific exception is caught first. and it's a compile time error if generic exception is caught befor specific one.

0

精彩评论

暂无评论...
验证码 换一张
取 消