本文共 2815 字,大约阅读时间需要 9 分钟。
1、try块后面可以有多个catch块,当包含catch子句时finally子句是可选的,包含finally子句时,catch子句是可选的。
2、在try块中当程序发生异常时后面的代码不会执行,进入catch代码块,catch代码对异常处理完毕后,程序作出向后执行,不会因为异常而终止。 3、无论try块中是否发生异常,finally块都会执行,除了try-catch代码块中执行System.exit(0),表示退出当前的java虚拟机。 4、 (1)在try或catch中有return语句,finally代码块中没有return语句,finally代码块中的语句仍旧会执行,程序执行到return语句时,会将变量保存,待执行完finally语句后,再返回,finally块中的语句不会影响最终的返回值,但finally块中的语句会改变变量的值。 (2)当try-catch代码块中都含有return语句时,具体可以分为两种情况:当try代码块中没有异常时,会执行try代码块中的return语句(return语句后面不能在有代码,因为程序执行到return时就停止了),但是程序时先将try代码块中return的返回值保存下来,跳过catch代码块(因为没有异常),执行finally代码块,finally代码块可能回改变catch代码块中return语句返回的变量的值,但是不会改变返回值(因为返回值已经保存了),若此时finally代码块中有return语句会执行return语句,并返回此时的返回值,(因此尽量不要在finally内写return),若finally代码块中没有return语句,程序会结束,并返回之前保存的返回值。 总结为:finally代码块一定会执行,若finally代码块中有return最终返回的是finally代码块中的返回值;若finally代码块没有return语句,try代码块中没有异常时,会执行try代码块中的return语句;若finally代码块没有return语句,try代码块中有异常时,会执行catch代码块中的return语句(finally代码块仍然执行,但不会改变返回值)。 1中的示例:try代码块后可以添加多个catch代码块,finally代码块为可选的try { 程序代码1 }catch(异常类型1 e1) { 程序代码2 }catch(异常类型2 e2) { 程序代码3 }catch(异常类型3 e3) { 程序代码4 }try代码块后不加catch块,只有finally代码块 try { 程序代码1 }finally { 程序代码5 }try代码块后添加多个catch代码块,和一个finally代码块 try { 程序代码1 }catch(异常类型1 e1) { 程序代码2 }catch(异常类型2 e2) { 程序代码3 }catch(异常类型3 e3) { 程序代码4 }finally { 程序代码5 }
2对应的示例:
public class TestTryCatch { public static int div(int a, int b) { return a/b; } public static void main(String[] args) { System.out.println("异常捕获开始"); try { int val = div(10, 0);// 此处出现异常,后面的代码不会执行 System.out.println(val); }catch(ArithmeticException e) { System.out.println("捕获到了异常"+e); return;//catch块中有return语句,finally块仍然会执行 }finally { System.out.println("开始执行finally代码块"); } }}
结果:
异常捕获开始捕获到了异常java.lang.ArithmeticException: / by zero开始执行finally代码块
3对应的示例:
package exception;public class TestTryCatch { public static int div(int a, int b) { return a/b; } public static void main(String[] args) { System.out.println("异常捕获开始"); try { int val = div(10, 0);// 此处出现异常,后面的代码不会执行 System.out.println(val); }catch(ArithmeticException e) { System.out.println("捕获到了异常"+e); System.exit(0); System.out.println("能不能执行"); return;//catch块中有return语句,finally块仍然会执行 }finally { System.out.println("开始执行finally代码块"); } }}
结果:
异常捕获开始捕获到了异常java.lang.ArithmeticException: / by zero
finally块没有执行。
4对应的示例:
package exception;public class TestFinally01 { public static int get(){ int x =1; try{ ++x; return x; }finally { ++x; System.out.println("finally:"+x); } } public static void main(String[] args){ System.out.println("最终返回值:"+get()); }}
结果:
finally:3最终返回值:2
finally块改变了变量x的值,并没有改变返回值。
转载地址:http://qypvn.baihongyu.com/