try catch和finally搭配return执行常见面试题讲解
我们都知道,在Java中try、catch和finally常用来做异常处理,而且他们有执行顺序,即先执行try,如果try中没有异常,则执行完try语句块后执行finally语句块,如果try中有异常,则顺序为执行到try语句块抛异常的地方后跳到catch语句块,最后执行fianlly语句块,但是当try、catch、finally中加入return之后,情况就有不同了,我们下面分别结合常见面试题来说明一下。
我们结合下面的程序,看看最终getInt()=?
public static void main(String[] args) {System.out.println("getInt()=" + getInt());}public static int getInt() {int a = 10;try {System.out.println(a / 0);a = 20;} catch (ArithmeticException e) {a = 30;System.out.println("走到catch,a=" + a);return a;} finally {System.out.println("走到finally,a=" + a);a = 40;System.out.println("走到finally,a=" + a);}System.out.println("走到最后a=" + a);return a;}
我们分析下执行顺序,0肯定不能为除数,所以直接抛异常调到catch语句块,先输出:走到catch,a=30
然后直接return a,程序执行到这一步的时候,形成返回路径,return 30
然后发现finally语句块,所以肯定要执行finally语句块的,先是输出:走到finally,a=30,再然后输出:走到finally,a=40
到此,程序执行结束,所以最终getInt()=30
因为catch语句块里已经return a形成返回路径,所以最后两句话不会执行。
如果我们注释掉catch语句块的return a,那么程序最后两句肯定执行(因为没有return),所以最终getInt()=40
如果我们注释掉catch语句块的return a,注释程序最后两句,在fianlly语句块里加return a,那么最终getInt()=40
下面我们结合String来说明,看看最终Stringget()=?
public static void main(String[] args) {System.out.println("Stringget()=" + Stringget());}public static String Stringget() {String a = "我最喜欢胡歌";try {System.out.println("try……我最喜欢的电视剧是《仙剑奇侠传一》");return a;} catch (Exception e) {System.out.println("catch……我最喜欢的歌曲是《逍遥叹》");} finally {a = a + " 并且我最喜欢的书籍是《山海经密码》";System.out.println("finally……我说完咯");}return a;}
首先,执行try语句块,输出:try……我最喜欢的电视剧是《仙剑奇侠传一》
因为程序不抛异常,所以不会执行catch语句块,所以直接执行finally语句块,输出:finally……我说完咯
因为try语句块里已经return,此时a这个String对象为我最喜欢胡歌,所以最终Stringget()=我最喜欢胡歌
如果我们把最后的return a加到fianlly语句块里:
当finally中有return的时候,try中的return会失效,在执行完finally的return之后,就不会再执行try中的return。这种写法,可以编译通过的,但是编译器会给予警告,所以不推荐在finally中写return,这会破坏程序的完整性,而且一旦finally里出现异常,会导致catch中的异常被覆盖。
总结:
1、finally中的代码总会被执行。
2、当try、catch中有return时,也会执行finally,但要注意return的返回值类型,是否受到finally中代码的影响。
3、finally中有return时,会直接在finally中退出,导致try、catch中的return失效。
try catch和finally搭配return执行常见面试题讲解相关推荐
- [Java面试]六:常见面试题之设计模式
我的博客首页:http://blog.csdn.net/m0_37116405 我的GitHub首页:https://github.com/KissLouis 设计模式六大原则 开闭原则:对扩展开放, ...
- Java开发常见面试题详解(JVM)_2
Java开发常见面试题详解(JVM)_2 JVM 问题 详解 JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots link 你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认 ...
- 【面试题】Java常见面试题集锦
Java常见面试题集锦 面试题模块 这份面试题,包含的内容了十九了模块:Java 基础.容器.多线程.反射.对象拷贝.Java Web 模块.异常.网络.设计模式.Spring/Spring MVC. ...
- 2020最新Java面试题(java,JavaWeb,数据库,框架),常见面试题及答案汇总
1.面试题模块汇总 面试题包括以下十九个模块:Java 基础.容器.多线程.反射.对象拷贝.Java Web 模块.异常.网络.设计模式.Spring/Spring MVC.Spring Boot/S ...
- BTA 常问的 Java基础40道常见面试题及详细答案,java初级面试笔试题
我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...
- C++常见面试题,来看看你会几个~~
C++常见面试题汇总: 写在开篇:汇总了一些公司的常见C++面试题~~收藏起来呀!! 正文开始@Assassin 目录: C++常见面试题汇总: 1. 变量的声明和定义有什么区别: 2. 简述#ifd ...
- 测试开发岗 - 常见面试题
目录 1. 什么是软件测试, 谈谈你对软件测试的了解 2. 我看你简历上有写了解常见的开发模型和测试模型, 那你跟我讲一下敏捷模型 3. 我看你简历上还写了挺多开发技能的, 那你给我讲讲哈希表的实现流 ...
- ConcurrentHashMap(jdk1.8)讲解及常见面试题
文章目录 前言 一.ConcurrentHashMap存储结构 二.存储元素 1.第一步:初始化数组长度 2.第二步:索引位为空时存储元素 3.第三步:索引位不为空时存储元素 4.第四步:并发扩容 三 ...
- Java进阶之深入理解对象与垃圾回收机制常见面试题
内存泄漏和内存溢出辨析 内存溢出:实实在在的内存空间不足导致: 内存泄漏:该释放的对象没有释放,多见于自己使用容器保存元素的情况下. 常量池与String 常量池 常量池有很多说法,包括运行时常量池. ...
最新文章
- Spring 整合 Junit
- 使用B::Deparse模块对perl代码反汇编
- pybind11回调函数返回指针
- iOS----------iPhone导出手机所有短信
- 算法导论第十二章:二叉查找树
- 68.connect-flash 用法详解 req,flash()
- 准爸爸日记——20120311
- C:#define用法
- selenium 文件上传
- Hybris产品主数据的价格维护
- delphi ascii字符数组_344. 反转字符串
- ActiveMQ群集,持久订阅者和虚拟主题可助您一臂之力
- LOJ10157——皇宫看守(树形DP)
- 一位腾讯离职创业 6 年 CEO 的忠告:不要等公司倒闭,才思考这 3 个问题
- 计算机网络安全(一)
- ikm2022/IKM考试/ikm java
- 元分析教程 | 手把手教你使用CMA 2.0
- Java web登录验证码
- eCharts绘制双系列混合类型图表+额外tooltip信息
- python语句print(type(1j))的输出结果_Python 语句print(type(1J))的输出结果是:_学小易找答案...