关于try catch finally
一、try catch finally的初步理解
首先,我们什么时候要用到try/catch和finally? ——已知执行的代码有可能有异常的情况下
try { //这里执行的代码如果出现异常,则立即跳到catch执行。}
catch { //除非try里面执行代码发生了异常,否则这里的代码不会执行 }
finally { //不管有没有异常,finally中的代码都会执行,可以理解为只要执行了try或者catch,就一定会执行 finally }
二、try catch finally的执行顺序(无return)
1.我们来看段代码
1 public class Test01 { 2 public static void main(String[] args) { 3 int i = 1; 4 test01(i); 5 } 6 7 public static void test01(int i) { 8 try { 9 i++; 10 System.out.println("try-----"+i); 11 i=1/0;//制造异常句子 12 i++; 13 System.out.println("try2-----"+i); 14 } catch (Exception e) { 15 i++; 16 System.out.println("catch-----"+i); 17 }finally { 18 i=5; 19 System.out.println("finally-----"+i); 20 } 21 } 22 }
2.控制台输出结果为:
3.总结:从输出结果可以看出,执行顺序为:try{} catch{} finally{} ;
也就是先执行try{}(try-----2),try里面发生异常(i=i/0;),跳去执行catch(catch-----3),不管有没有发生异常都会执行的finally(finally-----5);
(如果try里面没有异常将不执行catch,这里就不予以演示了)
三、try catch finally的执行顺序(带return),这里有两种情况
第一种,return在try catch finally 后面
1.我们来看段代码
1 public class Test01 { 2 public static void main(String[] args) { 3 int i = 1; 4 i=test01(i); 5 System.out.println("main--------"+i); 6 } 7 8 public static int test01(int i) { 9 try { 10 i++; 11 System.out.println("try-----"+i); 12 } catch (Exception e) { 13 i++; 14 System.out.println("catch----"+i); 15 }finally { 16 i++; 17 System.out.println("finally---"+i); 18 } 19 return i; 20 } 21 }
2.控制台输出结果
3.总结:从输出结果可以看出,执行顺序为:try{} /catch{} finally{} return;
在这里没有制造异常,就正常执行,“i”的初始值是“1”,在try里面“i++”--这时候“i”的值是“2”,在到finally里面执行“i++”,这时候“i”的值是“3”;
最后返回给方法返回的是“3”。
这里也进一步说明了无论try{}里面有没有发生异常,finally{}里面的代码都会执行
第二种,return在try catch 里面——重点
1.我们来看段代码
1 public class Test01 { 2 public static void main(String[] args) { 3 int i = 1; 4 i=test01(i); 5 System.out.println("main--------"+i); 6 } 7 8 public static int test01(int i) { 9 try { 10 i++; 11 System.out.println("try-----"+i); 12 return i; 13 } catch (Exception e) { 14 i++; 15 System.out.println("catch----"+i); 16 return i; 17 }finally { 18 i=5; 19 System.out.println("finally---"+i); 20 } 21 } 22 }
2.控制台输出结果为
3.总结:从输出结果可以看出,执行顺序依然是:try{} /catch{} finally{} return;
①finally是无论如何都会执行的(打印了fianlly),所以就算try里面有return语句也不会直接返回。
②执行了finally之后,按道理来说“i”的值应该是“5”,为什么最后返回给main方法的值是“2”呢:
个人猜测:这里返回的"i"不是原来的变量“i”,而是系统另外为try里面的“i值”定义了一个“i2”,返回的是“i2”,但是在这个时候“i”的值还是finally里面定义的“5”,然后在main方法里面又把“i2值”赋给了“i”,这时候"i"亦为“2”;
4.注意:如果在finally里面添加return语句,那么将会直接返回fianlly里面的“i”,这时候main里面输出的“i”值为“5”。
这也是进一步的说明了“不管有没有异常,finally中的代码都会执行”;那finally里面的代码执行了之后,便也执行了return语句,将不再执行try里面的return语句;