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

Java异常处理场景中不同位置的返回值详细解析的更多相关文章

  1. 为什么阿里巴巴Java开发手册中强制要求接口返回值不允许使用枚举?

    在阅读<阿里巴巴Java开发手册>时,发现有一条关于二方库依赖中接口返回值不允许使用枚举类型的规约,具体内容如下: 在谈论为什么之前先来科普下什么是二方库,二方库也称作二方包,一般指公司内 ...

  2. JAVA finally字句的异常丢失和返回值覆盖解析

    转载:http://blog.csdn.net/sureyonder/article/details/5560538 Java虚拟机在每个try语句块和与其相关的catch子句的结尾 处都会“调用”f ...

  3. 慕课网-Java入门第一季-7-3 Java 中无参带返回值方法的使用

    来源:http://www.imooc.com/code/1579 如果方法不包含参数,但有返回值,我们称为无参带返回值的方法. 例如:下面的代码,定义了一个方法名为 calSum ,无参数,但返回值 ...

  4. Java 中无参带返回值方法的使用

    如果方法不包含参数,但有返回值,我们称为无参带返回值的方法. 例如:下面的代码,定义了一个方法名为 calSum ,无参数,但返回值为 int 类型的方法,执行的操作为计算两数之和,并返回结果 在 c ...

  5. Java和Ibatis调用存储过程并取得返回值详解

    Java和Ibatis调用存储过程并取得返回值详解 2011-07-19 17:33 jiandanfeng2 CSDN博客 字号:T | T 本文主要介绍了Java和Ibatis调用存储过程的方法, ...

  6. python中os.system()的返回值

    [python中os.system()的返回值] 如果第三方程序返回的是布尔型返回值,os.system会将true转为1,false转为0进行返回. 问题: /bin/xxx.py是一个返回码为1的 ...

  7. PHP中使用CURL之php curl详细解析和常见大坑

    这篇文章主要介绍了PHP中使用CURL之php curl详细解析和常见大坑 ,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 七夕啦,作为开发,妹子没得撩就“撩”下服务器吧,妹子有得撩的同学 ...

  8. Java 中带参带返回值方法的使用

    如果方法既包含参数,又带有返回值,我们称为带参带返回值的方法. 例如:下面的代码,定义了一个 show 方法,带有一个参数 name ,方法执行后返回一个 String 类型的结果 调用带参带返回值的 ...

  9. java异常处理-finally中使用return和throw语句

    java异常语句中的finally块通常用来做资源释放操作,如关闭文件.关闭网络连接.关闭数据库连接等.正常情况下finally语句中不应该使用return语句也不应该抛出异常,以下讨论仅限于java ...

随机推荐

  1. [日常摸鱼]JSOI2008最大数

    校运会的时候随手抽的题- 一句话题意 维护一个序列,初始为空,要求滋兹: 1.查询这个序列末尾$x$个数的最大值 2.设上一次查询的答案为$t$(如果还没查询$t=0$),在末尾插入一个数$(x+t) ...

  2. BloomFilter中保存的数据量

    结果 /** * @author WeiJiQian * BF_CARDINAL_THRESHOLD BF_FALSE_POSITIVE_RATE 保存的数据量 * 100,0000 0.01 391 ...

  3. Flink统计日活

    .keyBy(0) .window(TumblingProcessingTimeWindows.of(Time.days(1), Time.hours(-8))) .trigger(Continuou ...

  4. 2020软件测试工程师面试题汇总(内含答案)-看完BATJ面试官对你竖起大拇指!

    测试技术面试题 1.什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台.软件平台上是否可以正常的运行,即是通常说的软件的可移植性. 兼容的类型,如果细分的话 ...

  5. Networking from the container's point of view 笔记

    Networking from the container's point of view Published portsThe type of network a container uses, w ...

  6. maven 报错 Failed to execute goal on project ...: Could not resolve dependencies for project ...

    昨天在研究 项目 遇到这样一个问题 可以看到 上面有三个 模块 jeecg-boot-base-common .jeecg-boot-module-system .jeecg-boot-modules ...

  7. 注解 @CrossOrigin

    在Controller中看到@CrossOrigin ,这是什么?有什么用?为什么要用? what? @CrossOrigin是用来处理跨域请求的注解 先来说一下什么是跨域: (站在巨人的肩膀上) 跨 ...

  8. 基于SpringBoot+Mybatis+MySQL5.7的轻语音乐网

    一个基于SpringBoot+Mybatis+MySQL5.7的轻语音乐网站项目 1.主要用到的技术: 使用maven进行项目构建 使用Springboot+Mybatis搭建整个系统 使用ajax连 ...

  9. 【剑指offer】04 重建二叉树

    题目地址:重建二叉树 题目描述                                    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不 ...

  10. JXL封装不能使用static关键字问题

    最近要做一个Excel导出的功能,由于文件不大,涉及到了很多Excel表格样式和公式计算,我采用了JXL的方式导出.由于逻辑大多是金额,所以我在封装JXL的时候写了两个静态final变量,代码如下: ...