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

论 异常处理机制中的return关键字的更多相关文章

  1. 异常处理机制中的return关键字

    Java中,执行try-catch-finally语句需要注意: 第一:return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂 ...

  2. Scala 中为什么不建议用 return 关键字

    在scala中使用 return 的话,编译的时候会提示the latest statement is method is automatically returned, use of th retu ...

  3. return 关键字的作用

    注意: 如果一个函数的返回值类型是具体的数据类型,那么该函数就必须要保证在任意情况下都保证有返回值.(除了返回值类型是void以外) return 关键字的作用: 1. 返回数据给函数的调用者. 2. ...

  4. Nginx return 关键字配置小技巧

    Nginx的return关键字属于HttpRewriteModule模块: 语法:return http状态码 默认值:无 上下文:server,location,if 该指令将结束执行直接返回htt ...

  5. 用return关键字实现1——100累加求和,返回总和并接收输出

    package com.Summer_0419.cn; /** * @author Summer * 用return关键字实现1——100累加求和,返回总和并接收输出 */ public class ...

  6. 用return关键字实现求和操作

    package com.Summer_0419.cn; /** * @author Summer * 用return关键字的知识,实现求和操作 */ public class Test_Method0 ...

  7. return关键字的作用和接受实验

    package com.Summer_0419.cn; /** * @author Summer * 查看return关键字的作用,实验目的: * 1.传入两个实参查看输出结果 * 2.传入两个无参数 ...

  8. 异常 try catch finally return 执行关系 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. “全栈2019”Java异常第九章:throws关键字详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

随机推荐

  1. 【leetcode 简单】 第九十七题 快乐数

    写一个程序,输出从 1 到 n 数字的字符串表示. 1. 如果 n 是3的倍数,输出“Fizz”: 2. 如果 n 是5的倍数,输出“Buzz”: 3.如果 n 同时是3和5的倍数,输出 “FizzB ...

  2. static_cast、dynamic_cast、reinterpret_cast、和const_c

    ;double dval = 3.14159; ival + dval;//ival被提升为double类型 2)一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型 int *pi =  ...

  3. 20165320 第四次实验 Android开发

    实验内容: Android程序设计-1 实验要求: - 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)>第二十四章: - 参 ...

  4. Strusts2笔记4--类型转换器

    类型转换器: Struts2默认情况下可以将表单中输入的文本数据转换为相应的基本数据类型.这个功能的实现,主要是由于Struts2内置了类型转换器.这些转换器在struts-default.xml中可 ...

  5. 【技巧总结】Penetration Test Engineer[2]-Information gathering

    2.信息收集 信息收集是属于前期交互阶段所需要了解的问题. 2.1.前期交互内容 签署授权文件:首要要和受测试方签订授权协议. 划定范围:指定了一个二级域名作为测试目标,那么其他二级域名在测试范围内. ...

  6. HDU 6203 2017沈阳网络赛 LCA,DFS+树状数组

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6203 题意:n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V ...

  7. 使用postman做接口测试(二)

    参考大神总结:https://www.cnblogs.com/Skyyj/p/6856728.html 二,下边的东西工作中实际要用到了 1, postman安装 chrome浏览器打开chrome: ...

  8. spark和hadoop比较

    来源知乎 计算模型:hadoop-MapReduce,Spark-DAG(有向无环图)评注:经常有人说Spark就是内存版的MapReduce,实际上不是的.Spark使用的DAG计算模型可以有效的减 ...

  9. 洛谷P2312解方程

    传送门 思路分析 怎么求解呢? 其实我们可以把左边的式子当成一个算式来计算,从1到 $ m $ 枚举,只要结果是0,那么当前枚举到的值就是这个等式的解了.可以通过编写一个 $ bool $ 函数来判断 ...

  10. (一)问候 HttpClient

    第一节: HttpClient 简介 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并 ...