因为在做题的时候碰到了一道相关的题目
所以写篇本文总结下 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