论 异常处理机制中的return关键字
Java中,执行try-catch-finally语句需要注意:
第一:return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回)
第二:finally里面不建议放return语句,根据需要,return语句可以放在try和catch里面和函数的最后。可行的做法有四种:
1)return语句只在方法最后出现一次。
2)return语句仅在try和catch里面都出现。
3)return语句仅在try和方法最后都出现。
4)return语句仅在catch和方法的最后都出现。
注意,除此之外的其他做法都是不可行的,编译器会报错。
(1)如果程序运行到try成功时可以返回结果,则采用方法2。
(2)如果程序运行到catch时(即中途出错时)无需再继续执行后面的代码了,则采取方法4。
(3)如果程序运行到try或catch时还需要继续执行后面的代码,则采取方法1。
demo 1:
package cn.day006;
public class Test {
public static void main(String[] args) {
System.out.println(getResult());
}
@SuppressWarnings("finally")
public static int getResult(){
int a =100;
try{
return a+1; //注意,java的基础数据类型是值传递,这里的返回值已经和上面的a没有关系了
}catch(Exception e){
e.printStackTrace();
}finally{
return a; //最后再把值重定向到a(相当于将try中的返回值覆盖掉),所以输出还是100
}
}
}
执行结果:100
demo 2:
package cn.day006;
public class Test {
public static void main(String[] args) {
System.out.println(getResult());
}
@SuppressWarnings("finally")
public static int getResult(){
int a =100;
try{
return a++; //切记 a++ ----> a=a+1 此时a的值做出了改变
}catch(Exception e){
e.printStackTrace();
}finally{
return a;
}
}
}
执行结果:101
demo 3:
package cn.day006;
public class Test {
public static void main(String[] args) {
System.out.println(getResult());
}
public static int getResult(){
int a =100;
try{
a++;
return a;
}finally{
a++;
}
}
}
结果是101。
分析:
在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。
在转去之前,try中先把要返回的结果存放到不同于x的局部变量中去,执行完finally之后,在从中取出返回结果,
因此,即使finally中对变量x进行了改变,但是不会影响返回结果。
它应该使用栈保存返回值。
demo 4:
package cn.day006;
public class Test2 {
public static void main(String[] args) {
try{
System.out.println(getResult());
}catch(Exception e){
e.printStackTrace();
System.out.println("截获异常catch");
}finally{
System.out.println("异常处理finally");
}
}
@SuppressWarnings("finally")
public static int getResult() throws Exception{
int a =100;
try{
a=a+10;
throw new RuntimeException();
}catch(Exception e){
System.out.println("截获异常并重新抛出异常");
throw new Exception();
}finally{
return a;
}
}
}
结果如下:
截获异常并重新抛出异常 110 异常处理finally
关键的“截获异常catch”却没有执行!!!
原因是在getResult()的finally中return一个值,等同于告诉编译器该方法没有异常,但实际上异常是有的,这样的结果是该方法的调用者却捕获不到异常,相对于异常被无端的被吃掉了,隐藏杀机啊!!
结论:不要再finally中试图return一个值,这样可能会导致一些意想不到的逻辑错误,finally就是用来释放资源的!!
参考牛人博客:http://blog.csdn.net/z69183787/article/details/61923256
- 开发人员看测试之运行Github中的JBehave项目
- 如何高效地合并Spark社区PR到自己维护的分支
- 开发人员看测试之TDD和BDD
- AngularJS入门心得1——directive和controller如何通信
- AngularJS入门心得2——何为双向数据绑定
- AngularJS入门心得3——HTML的左右手指令
- AngularJS入门心得4——漫谈指令scope
- Enterprise Library深入解析与灵活应用(8):WCF与Exception Handling AppBlock集成[上]
- 苹果就“电池门”公开致歉;微信下拉任务栏新增小游戏;美团打车进入北京
- 新华三《中国城市数字经济指数白皮书》:深圳数字经济发展水平国内居首
- NodeMCU模块写入MicroPython固件
- 如何证明Application Domain的隔离性
- Enterprise Library深入解析与灵活应用(8):WCF与Exception Handling AppBlock集成[下]
- 我所理解的Remoting(1):Marshaling & Activation[上篇]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 这些年,我写过的BUG(一)
- Selenium处理下拉列表
- 掌握好这几个css属性,少写100行js代码
- 计算机基础知识总结与操作系统 PDF 下载
- Kafka工作流程及文件存储机制
- JS破解初探,折腾到头秃的美拍视频采集下载
- 去哪儿景点信息爬取并使用Django框架网页展示
- Kubernetes v1.15.3 升级到 v1.18.5 心得
- 结巴分词seo应用,Python jieba库基本用法及案例参考
- nali一个可以查询IP归属和CDN的命令
- 图片采集,python多线程采集头像图片源码附exe程序及资源包
- Python json数据爬取处理,红点官网大奖设计作品爬取
- 斗图狂魔必备沙雕表情包,python多线程爬取斗图啦表情图片
- 5个基本Linux命令行工具的现代化替代品
- Chrome 84 正式发布,支持私有方法、用户空闲检测!