博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于try...catch...finally中return的疑惑
阅读量:6831 次
发布时间:2019-06-26

本文共 2629 字,大约阅读时间需要 8 分钟。

原文:http://www.cnblogs.com/and_he/archive/2012/04/17/2453703.html

关于try...catch...finally里面的return一直是面试的一个热门考点。无非就分以下几个情况:

1、当有finally语句并且try中有return,在执行到return(还未执行)的时候,会先执行finally里面的内容,然后再执行行try中的return。

package com.and.java.demo;public class 测试 {    public static void main(String[] args) {        System.out.println(new 测试().test());    }    public String test() {        try {            System.out.println("try{...}");            return "try";        } catch (Exception e) {            System.out.println("catch{...}");            return "catch";        } finally {            System.out.println("finally{...}");        }    }}

输出:

try{...}finally{...}try

2、在1的基础上,如果finally里面也有return语句,则try代码块中的return被屏蔽(不执行),即在try中遇到return的时候,会先执行finally里面的内容(包括finally里面的return语句)。

package com.and.java.demo;public class 测试 {    public static void main(String[] args) {        System.out.println(new 测试().test());    }    public String test() {        try {            System.out.println("try{...}");            return "try";        } catch (Exception e) {            System.out.println("catch{...}");            return "catch";        } finally {            System.out.println("finally{...}");            return "finally";        }    }}

输出:

try{...}finally{...}finally

遇到的问题:

这两种情况想必大家已经掌握。但是还有一种情况,也是我不能理解的地方。一般情况下,在finally里面作一些数据的关闭操作(比如文件,输入/输出流,数据库的关闭),试想一下,要是我们在finally里面对要返回的值进行修改,那会反应到最终的结果上去吗?(因为从上面的讲解可以知道,当try里面有return的时候,它不会立刻执行,会先执行finally里面的内容,然后再执行return)。

package com.and.java.demo;public class 测试 {    public static void main(String[] args) {        System.out.println(new 测试().test());    }    public String test() {        String result = "";        try {            result = "try";            return result;        } catch (Exception e) {            result = "catch";            return result;        } finally {            result = "finally";        }    }}

试想一下,它会输出"try" 呢还是"finally"呢?

输出:

try

确实只输出try,但是我们在finally里面是改变了result的值呀?

再进一步改进,判断finally里面的赋值语句是否执行

package com.and.java.demo;public class 测试 {    public static void main(String[] args) {        System.out.println(new 测试().test());    }    public String test() {        String result = "";        try {            result = "try";            return result;        } catch (Exception e) {            result = "catch";            return result;        } finally {            System.out.println("t1->"+result);            result = "finally";            System.out.println("t2->"+result);        }    }}

输出:

t1->tryt2->finallytry

从输出结果可以看出,finally里面的赋值语句是执行了的,但是在return结果中怎么就没变呢?(目前暂时研究到这个地步,仍没搞明白,还望各位高手指点)

转载于:https://www.cnblogs.com/zhizhan/p/4822596.html

你可能感兴趣的文章
Pycharm 项目运行错误问题整理
查看>>
Logtail从入门到精通(六):工作原理简介
查看>>
阿里云王牌架构师二问开发者:容器和虚拟化你会怎么选?
查看>>
reids复制的原理和优化
查看>>
iterm 配置
查看>>
【刷算法】求机器人的运动范围
查看>>
cookie跨域共享 cookie二级域名共享 前后端分离项目共享cookie
查看>>
Dart4Flutter-01– 变量, 类型和 函数
查看>>
k8s与监控--prometheus的远端存储
查看>>
Extjs的一些基础使用!
查看>>
【VUE入门】父组件给子组件传值
查看>>
小程序折叠与展开文章的的实现
查看>>
人生苦短,我用 ES6 模板
查看>>
tornado学习笔记(1)HTTP请求及API测试
查看>>
实时计算 Flink SQL 核心功能解密
查看>>
升级webpack4踩的坑
查看>>
【跃迁之路】【429天】刻意练习系列188—SQL(2018.04.10)
查看>>
Git简介
查看>>
Echarts中关于自定义legend图例文字
查看>>
ionic监听android返回键(实现“再按一次退出”功能)
查看>>