JAVA try-catch-finally-return
- 正常执行流程:
- 含return语句执行流程分析:
- 对x执行运算x=x+1 (若有运算)
- 复制一个变量x给try的return语句(按值复制:基本类型就是值本身,对象就是地址值)
- 但return语句并不马上返回,控制权转移到finally块中执行: (1)若finally中无return语句:finally执行完后,try块执行return语句返回之前复制的变量x(基本类型就是值本身,对象就是地址值)(所以:若x为基本类型,fianlly中改变x对最终return结果无效;若x为对象类型,按地址值传递可以改变x的最终return结果) (2)若finally中有return语句:执行后直接返回(即“覆盖try中return语句”:try中return语句不再返回)
- finally不执行的特殊情况:
- if you call System.exit() or
- if the JVM crashes first
- A return statement in the finally block is a bad idea:
publicstaticint getANumber(){
try{
thrownewNoSuchFieldException();
} finally {
return43;
}
}
- If the return in the try block is reached, it transfers control to the finally block, and the function eventually returns normally (not a throw).
- If an exception occurs, but then the code reaches a return from the catch block, control is transferred to the finally block and the function eventually returns normally (not a throw).
- In your example, you have a return in the finally, and so regardless of what happens, the function will return 34, because finally has the final (if you will) word.
- 在try中含有return+基本类型情况:
publicclassFinallyTest1{
publicstaticvoid main(String[] args){
System.out.println(test1());
}
publicstaticint test1(){
int b =20;
try{
System.out.println("try block");
return b +=80;
}
catch(Exception e){
System.out.println("catch block");
}
finally {
System.out.println("finally block");
if(b >25){
System.out.println("b>25, b = "+ b);
}
}
return b;
}
}
try block
finally block
b>25, b =100
100
- 在catch中含有return+基本类型情况(分析跟在try中含有return情况一样):
publicclassTest{
publicstaticvoid main(String[] args){
System.out.println(test1());
}
publicstaticint test1(){
int b =20;
try{
int a =1/0;//触发异常
System.out.println("try block");//不会被执行
return b +=80;//不会被执行
}
catch(Exception e){
System.out.println("catch block");
return b +=180;//最后在此返回
}
finally {
System.out.println("finally block");
if(b >25){
System.out.println("b>25, b = "+ b);
}
}
// return b;
}
}
catch block
finally block
b>25, b =200
200
- 在try中含有return+对象类型情况:
publicclassTest{
publicstaticvoid main(String[] args){
System.out.println(getMap().get("KEY").toString());
}
publicstaticMap<String,String> getMap(){
Map<String,String>map=newHashMap<String,String>();
map.put("KEY","INIT");
try{
map.put("KEY","TRY");
returnmap;//return在控制权转移到finally前:复制了一个map对象的地址值(对象按地址值传递)
}
catch(Exception e){
map.put("KEY","CATCH");
}
finally {
map.put("KEY","FINALLY");//根据对象地址值修改对象内容(按地址值传递),因此会影响try中return返回的对象内容
map= null;//map为null即不再指向该对象,
// 但由于前面return复制了一个对象的引用(地址值),而对象是被分配在堆中的,只要有引用指向这个对象,系统就不会回收此对象,
所以此处map = null 并不会影响最后try中return返回对象内容}
returnmap;
}
}
FINALLY
- 在catch中含有return+基本类型情况(分析跟在try中含有return情况一样):
publicclassTest{
publicstaticvoid main(String[] args){
System.out.println(getMap().get("KEY").toString());
}
publicstaticMap<String,String> getMap(){
Map<String,String>map=newHashMap<String,String>();
map.put("KEY","INIT");
try{
int a =1/0;//触发异常
map.put("KEY","TRY");//不会被执行
returnmap;//不会被执行
}
catch(Exception e){
map.put("KEY","CATCH");
returnmap;//return在控制权转移到finally前:复制了一个map对象的地址值(对象按地址值传递)
}
finally {
map.put("KEY","FINALLY");//根据对象地址值修改对象内容(按地址值传递),因此会影响catch中return返回的对象内容
map= null;//map为null即不再指向该对象,
// 但由于前面return复制了一个对象的引用(地址值),而对象是被分配在堆中的,只要有引用指向这个对象,系统就不会回收此对象,
// 所以此处map = null 并不会影响最后catch中return返回对象内容
}
// return map;
}
}
FINALLY
publicclassTest{
publicstaticvoid main(String[] args){
System.out.println(test2());
}
publicstaticint test2(){
int b =20;
try{
System.out.println("try block");
return b +=80;
}catch(Exception e){
System.out.println("catch block");
} finally {
System.out.println("finally block");
if(b >25){
System.out.println("b>25, b = "+ b);
}
return200;
}
// return b;
}
}
try block
finally block
b>25, b =100
200
JAVA try-catch-finally-return的更多相关文章
- java try catch finally return执行
public static int testBasic(){ int i = 1; try{ i++; System.out.println("try block, i = "+i ...
- 【Java疑难杂症】有return的情况下try catch finally的执行顺序
有这样一个问题,异常处理大家应该都不陌生,类似如下代码: public class Test { public static void main(String[] args) { int d1 = 0 ...
- 可惜Java中没有yield return
项目中一个消息推送需求,推送的用户数几百万,用户清单很简单就是一个txt文件,是由hadoop计算出来的.格式大概如下: uid caller 123456 12345678901 789101 12 ...
- 异常 try catch finally return 执行关系 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Java_try,catch,finally return之间的执行顺序
以往认为函数只要执行到return语句便会返回结果并终止,然而这时错误的,因为这存在特例. 掌握下面几条原则就可以完全解决“当try.catch.finally遭遇return”的问题. 原则:1.f ...
- try catch finally return之间的关系
一.try catch finally return之间的关系: 正在写dsoFramer的时候,同事突然说面试的时候问的一个问题,catch和return那个先执行,我瞬间迷茫了,然后整理了整理,稍 ...
- Intellij Idea 12 开发Android 报Caused by: java.lang.UnsatisfiedLinkError: FindLibrary return null;
这次开发是用的百度地图api,导入两个so文件,结果启动的时候总是报Caused by: java.lang.UnsatisfiedLinkError: findlibrary return null ...
- Hint: Fallback method 'public java.lang.String queryUserByIdFallback(java.lang.Long)' must return: User or its subclass
1.错误日志 熔断器添加错误方法返回时,报了一个 error. com.netflix.hystrix.contrib.javanica.exception.FallbackDefinitionExc ...
- try catch finally return运行顺序
首先让我们搞懂两组概念:try catch finally和return 1.try catch finally 首先说try catch, (1)try语句 ,try语句用来包围可能出现异常的代码片 ...
- 理清Java中try-catch-finally带return的执行顺序
前言:try-catch-finally带return和异常时,它们之间执行顺序问题是留下来的一个小疑问,今天搞清楚它们 第一种情况:无异常 //1.try-catch-finally都带有retur ...
随机推荐
- 『重构--改善既有代码的设计』读书笔记----Replace Temp with Query
Replace Temp with Query,顾名思义,表示你用查询来替换临时变量本身,临时变量对于函数来说是只有当前函数可见的,如果你在同类的别的地方要用到这个变量你就必须重新写表达式来获取这个变 ...
- Chrome不支持本地Ajax请求解决?
今天用JQuery操作Ajax时,使用load方法加载html块 结果提示: XMLHttpRequest cannot load file~~~~~~~Origin 'null' is theref ...
- sql 批处理、获取自增长、事务、大文本处理
批处理 需要批量执行sql语句! 需求:批量保存信息! 设计: AdminDao Public void save(List<Admin list){ // 目前用这种方式 // 循环 // 保 ...
- bzoj2071: [POI2004]JAS
Description 在Byteotia有一个洞穴. 它包含n 个洞室和一些隧道连接他们. 每个洞室之间只有一条唯一的路径连接他们. Hansel 在其中一个洞室藏了宝藏, 但是它不会说出它在哪. ...
- 实验三:gdb跟踪调试内核从start_kernel到init进程启动
原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 如果我写的不好或者有误的地方请留言 ...
- JAVA基础(1)之hashCode()
JAVA基础(1)之hashCode() 看到一篇关于hashCode的文章(),写的很详细明白,瞬间有种恍然大悟的感觉,所以特地转过来.原文:http://blog.csdn.net/fenglib ...
- ISO15693协议的Inventory
ISO15693的Inventory指令看起来比较让人迷糊,想明白其流程,我认为以下几点是必须了解的: 第一.ISO15693标签的几种状态,资料上有,这里罗嗦重复一下: 1.PowerOff状态 2 ...
- 软件发布版本区别介绍-Alpha,Beta,RC,Release
Alpha: Alpha是内部测试版,一般不向外部发布,会有很多Bug.除非你也是测试人员,否则不建议使用. 是希腊字母的第一位,表示最初级的版本 alpha就是α,beta就是β alpha版就是比 ...
- COJN 0558 800600带通配符的字符串匹配
800600带通配符的字符串匹配 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 通配符是一类键盘字符,当我们不知道真正字符或者 ...
- BZOJ1660: [Usaco2006 Nov]Bad Hair Day 乱发节
1660: [Usaco2006 Nov]Bad Hair Day 乱发节 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 606 Solved: 289 ...