Java 异常处理中的返回值在不同位置不同场景下是有一些差别的,这里需要格外注意

具体分以下两种场景:

  • 1 finally语句块没有return语句,即当代码执行到try或者catch语句块中的return语句时,相当于在本地保存了一份此时返回值的变量的值副本,然后按照try catch finally的运行机制去执行finally语句块,然后回过来将刚刚保存的副本数据返回

第一个例子为在try中没有异常,直接走到try语句块中的return场景

public class Test01 {
public static void main(String[] args) {
int results=new Test01().test(10,2);
System.out.println("func results:"+results);
} public int test(int a,int b)
{
int results=0;
try
{
System.out.println("in try.....");
results+=1;
System.out.println("results = "+results);
return results;
}
catch (Exception e)
{
System.out.println("in catch......");
results+=1;
System.out.println("results = "+results);
return results;
}
finally {
System.out.println("in finally");
results+=1;
System.out.println("results = "+results);
}
}
}

执行结果如下,最后函数返回的值是1,而不是2

in try.....
results = 1
in finally
results = 2
func results:1

第二个例子为try中出现了异常,但是在catch中走到了return语句

public class Test01 {
public static void main(String[] args) {
int results=new Test01().test(10,2);
System.out.println("func results:"+results);
} public int test(int a,int b)
{
int results=0;
try
{
System.out.println("in try.....");
results+=1;
System.out.println("results = "+results);
double d=1/0;
return results;
}
catch (Exception e)
{
System.out.println("in catch......");
results+=1;
System.out.println("results = "+results);
return results;
}
finally {
System.out.println("in finally");
results+=1;
System.out.println("results = "+results);
}
}
}

返回值如下,即此时返回值是2而不是3

in try.....
results = 1
in catch......
results = 2
in finally
results = 3
func results:2
  • 2 finally语句块有return语句,此时即最终返回finally语句块中的的值,而try或者catch语句块中及时有return语句,也不会发生作用

下面的例子即try中能走到return语句,同样finally中也有return语句时候,此时返回finally语句块中的return的值

public class Test01 {
public static void main(String[] args) {
int results=new Test01().test(10,2);
System.out.println("func results:"+results);
} public int test(int a,int b)
{
int results=0;
try
{
System.out.println("in try.....");
results+=1;
System.out.println("results = "+results);
return results;
}
catch (Exception e)
{
System.out.println("in catch......");
results+=1;
System.out.println("results = "+results);
return results;
}
finally {
System.out.println("in finally");
results+=1;
System.out.println("results = "+results);
return results;
}
}
}

执行结果如下,返回2,此时不是返回1了

in try.....
results = 1
in finally
results = 2
func results:2

下面的例子即在catch走到了return语句,同样在finally语句块中也走到了return语句,此时同样也是返回finally语句块中的值,catch语句块中的返回值失效

public class Test01 {
public static void main(String[] args) {
int results=new Test01().test(10,2);
System.out.println("func results:"+results);
} public int test(int a,int b)
{
int results=0;
try
{
System.out.println("in try.....");
results+=1;
System.out.println("results = "+results);
double d=1/0;
return results;
}
catch (Exception e)
{
System.out.println("in catch......");
results+=1;
System.out.println("results = "+results);
return results;
}
finally {
System.out.println("in finally");
results+=1;
System.out.println("results = "+results);
return results;
}
}
}

执行结果如下:返回3而不是2了

in try.....
results = 1
in catch......
results = 2
in finally
results = 3
func results:3

最新文章

  1. css属性兼容主流浏览器
  2. Codeforces Round #361 (Div. 2) C
  3. SQL分页
  4. Unity3D 5.x 交互功能 - 光线投射、碰撞设置
  5. WEKA使用
  6. tail -f 和 -F 的用法
  7. 时间:UTC时间、GMT时间、本地时间、Unix时间戳
  8. Python 学习之urllib模块---用于发送网络请求,获取数据(2)
  9. ubuntu下安装svn
  10. EasyUI - Panel 面板控件
  11. cocos2d-x 3.0来做一个简单的游戏教程 win32平台 vs2012 详解献给刚開始学习的人们!
  12. uva10635 LCS映射转LIS
  13. Android自动打包工具aapt详解
  14. 解决centos7.x图形化界面卡死(鼠标能动,但不能点击)问题
  15. kvm动态添加硬盘
  16. itchat分析微信好友的个性签名
  17. 隐马尔可夫模型:HMM
  18. js异步计时器
  19. 论文阅读笔记 Improved Word Representation Learning with Sememes
  20. python if elif else判断语句

热门文章

  1. Flink读取resource资源文件
  2. C++ static 数据成员和构造函数
  3. 解决Yii ActiveForm监听submit触发2次submit
  4. Azure Service Bus(二)在NET Core 控制台中如何操作 Service Bus Queue
  5. Abp vNext异常处理的缺陷/改造方案
  6. 使用CentOS8来部署php7.4
  7. Hyperledger fabric 1.4 环境搭建(一)
  8. SpringBoot整合任务调度框架Quartz及持久化配置
  9. umi-request 统一异常处理实践
  10. easyui中在formatter: function (value, row,index) {中添加删除方法