[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://www.cnblogs.com/cnb-yuchen/p/18299911
出自【进步*于辰的博客

参考笔记一,P35.4/5。

1、介绍

相信大家对try...catch...finally都很熟悉了,在此我提一点使用细节。

大家先看这段代码:

try {
    return 0;
} catch (Exception e) {
} finally {
    return 1;
}

请问编译通过吗?如果通过,返回值是多少?

要回答这个问题,需要对异常处理的机制有一个较为全面的了解。如下:

  1. 异常处理不会终止主线程,即不会终止try...catch...finally语句块外代码的执行。
  2. 无论try...catch...中有无return、是否出现异常,finally都会执行,前提是在执行finally前,主线程未终止(PS:寻得一篇博文《finally中的代码一定会执行吗?》(转发),文中列举了许多这种情况)。
  3. try...catch...finally中都有return,前者会被后者覆盖。因为返回值存储于栈,而栈是“先进后出”。

因此,编译通过,返回值为1

注意

  1. try中尽量不要放置太多代码,因为异常处理是线程,“检查性异常”之所以可以实时检查,是因为此线程在自动循环检查。如果代码太多,会占用太多内存,降低程序性能。
  2. 上文说道:“异常处理不会终止主线程”,也就是catch {}处理了异常,即使try {}中出现了异常也不影响主线程(例如int a = 1 / 0手动生成一个异常)。

2、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();
}

使用条件:

  1. 能够置于A的类必须实现了Closeable接口。
  2. B的异常列表中,每一类异常只能出现一个,且必须是这一类中“最大”的异常。如示例中FileNotFoundException与IOException都属于IO异常,故B中需是IOException或“更大”的异常,而不能是FileNotFoundException。

这一种写法的另一个好处是:程序会自动关闭资源。

最后

暂无言。

本文完结。

posted @ 2024-07-13 11:55  进步·于辰  阅读(11)  评论(0编辑  收藏  举报