我们知道return会结束此方法并返回指定值。以及在Try-catch-finally中无论try代码块中有没有异常finally中的代码时都会被执行的。但是如果return包含在try-catch-finally中的try或catch块中会怎样呢?
我们再做个试验:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 static int txt(){ 2 try { 3 @SuppressWarnings("unused") 4 int a=5/0; 5 7 } catch (Exception e) { 8 System.out.println("catch"); 9 return 2; 10 }finally{ 11 System.out.println("finally"); 12 } 13 return 3; 14 }
看上面代码我们知道在try中”int a=5/0”是肯定会报错的接下来程序会进入catch中进行异常处理但是在catch中使用return 返回了一个2;这时finally中的代码到底还会会走呢?如果finally中的代码走了的话,return返回的结果又是什么?
我们来开一下调用此方法输出的结果:
我们可以看到finally块即使catch块有return他还是会被执行的
我们再来开下面一个例子
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 static int txt(){ 2 try { 3 4 int a=5/0; 5 6 7 } catch (Exception e) { 8 System.out.println("catch"); 9 return 2; 10 }finally{ 11 System.out.println("finally"); 12 return 3; 13 } 14 15 }
这时return返回的又是多少呢?
话不多时来看结果吧:
我们可以这摸理解:我们定义一个有返回值类型的方法时系统会自动声明一个堆栈上的内存地址用来存放此方法返回的值这也是我们定义一个有返回值类型的方法却没有给定返回值是产生编译错误的原因!当程序执行到catch块的return时会吧return后面的值存放在事先声明的堆栈内存中并不结束此方法后再执行finally块的代码,但是finally块中也有return关键字所以在事先声明的堆栈内存中保存的值也就变成了finally块中return后面的值。又因为finall块后有没有强制执行的代码块所以此方法结束。
以上内容为个人理解如有 不足之处请各位大神多多指正。
思考:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 static int txt(){ 2 int a=1; 3 try { 4 5 a++; 6 return a; 7 8 }finally{ 9 ++a; 10 } 11 }
此方法的返回值是多少。