因为一道题,我把 try-catch-finally 的细节都整理了一遍(1500字)

118 阅读2分钟

因为在做题的时候碰到了一道相关的题目

所以写篇本文总结下 try-catch-finally 相关的易错点

文章长 1500字 (很多都是代码,看的很快的)

如果还有其它的点,欢迎大家评论区留言

1. try 中某句如果出现异常,则该块中剩下的代码不会执行

public static void main(String[] args) {
    try {
        int i = 1 / 0;
        System.out.println("哈哈");
    } catch (ArithmeticException e) {
        throw new RuntimeException("throw了一个异常");
    } finally {
        System.out.println("finally");
    }
}

catch块/finally块 也同样如此

2. 多个catch块,先出现的catch块捕获的异常类型必须小于等于后面catch块中的异常

如果这样的话,后面的异常都会在前面catch中捕获,那后面的catch就没有意义了

public static void main(String[] args) {
    try {
        int i = 1 / 0;
    } catch (Exception e) {
        System.out.println("haha");
    } catch (ArithmeticException e) {
        System.out.println("嘿嘿");
    } finally {
        System.out.println("finally");
    }
}

3. try / catch 中有 return,finally也有return 最终生效的是 finally中的

public static void main(String[] args) {
    System.out.println(f());
}

public static String f() {
    try {
        return "try";
    } catch (ArithmeticException e) {
        return "catch";
    } finally {
        return "finally";
    }
}

//最终输出 finally

4. 如果catch中有return但finally中也有return,那么将返回finally中的,但catch中 return后面的内容如前置或后置++等操作是会执行生效的

原因:return i++; 在内部是可以分为三步,① int tmp = i; ② i += 1; ③ return tmp;

所以才会导致如下结果。

public static void main(String[] args) {
    System.out.println(f());
}

public static int f() {
    int i = 1;
    try {
        return i /= 0;
    } catch (ArithmeticException e) {
        return i++;
    } finally {
        return i;
    }
}

5. 如果catch中有return,而finally中没有return,那么将返回catch中的,就算finally中的代码对catch中的返回值进行了修改,catch返回的内容依旧是未执行finally块时的。

public static void main(String[] args) {
    System.out.println(f());
}

public static int f() {
    int i = 1;
    try {
        return i /= 0;
    } catch (ArithmeticException e) {
        return i;
    } finally {
        i++;
    }
}

顺便再提几个异常相关需要注意的点

1.throws抛出异常必须大于等于方法内产生的异常。

2.一个方法如果调用了一个抛出编译时异常的方法,那么必须处理。

3.throws后可以是多个异常,他们之间用 , 隔开

4.运行时异常未做处理,相当于默认throws处理。

4.子类重写父类方法时,抛出的异常要小于等于父类的。

5.注意在某方法内时抛出异常对象是用throw,而在方法声明中抛出异常类型是用throws