Java 代码
- import java.io.IOException;
- public class ExceptionTryCatchTest {
- public void doSomething() throws IOException{
- System.out.println("do somthing");
- }
- public static void main(String[] args){
- ExceptionTryCatchTest etct = new ExceptionTryCatchTest();
- try {
- etct.doSomething();
- } catch (Exception e) {
- } catch (IOException e) {
- }
- }
- }
[问题]
上述程序能否编译通过? 为什么?
[解答]
不能编译通过. 因为编译的时候会报错: 已捕捉到异常 java.io.IOException. catch(IOException e)这句有错误.
分析: 对于 try..catch 捕获异常的形式来说, 对于异常的捕获, 可以有多个 catch. 对于 try 里面发生的异常, 他会根据发生的异常和 catch 里面的进行匹配 (怎么匹配, 按照 catch 块从上往下匹配), 当它匹配某一个 catch 块的时候, 他就直接进入到这个 catch 块里面去了, 后面在再有 catch 块的话, 它不做任何处理, 直接跳过去, 全部忽略掉. 如果有 finally 的话进入到 finally 里面继续执行. 换句话说, 如果有匹配的 catch, 它就会忽略掉这个 catch 后面所有的 catch. 对我们这个方法来说, 抛出的是 IOException, 当执行 etct.doSomething(); 时, 可能会抛出 IOException, 一但抛出 IOException, 它首先进入到 catch (Exception e) {} 里面, 先和 Exception 匹配, 由于 IOException extends Exception, 根据多态的原则, IOException 是匹配 Exception 的, 所以程序就会进入到 catch (Exception e) {}里面, 进入到第一个 catch 后, 后面的 catch 都不会执行了, 所以 catch (IOException e) {}永远都执行不到, 就给我们报出了前面的错误: 已捕捉到异常 java.io.IOException.
[总结]
在写异常处理的时候, 一定要把异常范围小的放在前面, 范围大的放在后面, Exception 这个异常的根类一定要放在最后一个 catch 里面, 如果放在前面或者中间, 任何异常都会和 Exception 匹配的, 就会报已捕获到... 异常的错误.
https://blog.csdn.net/yasi_xi/article/details/23871867
Java 中多个异常的捕获顺序(多个 catch)
来源: http://www.bubuko.com/infodetail-2863142.html