[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://www.cnblogs.com/cnb-yuchen/p/18299911
出自【进步*于辰的博客】
参考笔记一,P35.4/5。
介绍
相信大家对try...catch...finally
都很熟悉了,在此我提一点使用细节。
大家先看这段代码:
try { return 0; } catch (Exception e) { } finally { return 1; }
请问编译通过吗?如果通过,返回值是多少?
要回答这个问题,需要对异常处理的机制有一个较为全面的了解。如下:
- 异常处理不会终止主线程,即不会终止
try...catch...finally
语句块外代码的执行。 - 无论
try...catch...
中有无return
、是否出现异常,finally
都会执行,前提是在执行finally
前,主线程未终止(PS:寻得一篇博文《finally中的代码一定会执行吗?》(转发),文中列举了许多这种情况)。 - 若
try...catch...
和finally
中都有return
,前者会被后者覆盖。因为返回值存储于栈,而栈是“先进后出”。
因此,编译通过,返回值为1
。
注意:
try
中尽量不要放置太多代码,因为异常处理是线程,“检查性异常”之所以可以实时检查,是因为此线程在自动循环检查。如果代码太多,会占用太多内存,降低程序性能。- 上文说道:“异常处理不会终止主线程”,也就是
catch {}
处理了异常,即使try {}
中出现了异常也不影响主线程(例如int a = 1 / 0
手动生成一个异常)。
try...with...resources
这是JDK1.7异常处理新特性。
常规写法示例:
try { Class clazz = Class.forName(""); FileReader fr = new FileReader(""); FileWriter fw = new FileWriter(""); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
新写法:
try(FileReader fr = new FileReader(""); FileWriter fw = new FileWriter("")) {// ------------A Class clazz = Class.forName(""); } catch (ClassNotFoundException | IOException e) {// ---B e.printStackTrace(); }
使用条件:
- 能够置于A的类必须实现了Closeable接口。
- B的异常列表中,每一类异常只能出现一个,且必须是这一类中“最大”的异常。如示例中FileNotFoundException与IOException都属于IO异常,故B中需是IOException或“更大”的异常,而不能是FileNotFoundException。
这一种写法的另一个好处是:程序会自动关闭资源。
最后
暂无言。
本文完结。
分类:
Java知识点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY