【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://developer.aliyun.com/article/1631771
出自【进步*于辰的博客】参考笔记一,P35.4/5。
1、介绍
相信大家对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
手动生成一个异常)。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();
}
使用条件:
- 能够置于A的类必须实现了Closeable接口。
- B的异常列表中,每一类异常只能出现一个,且必须是这一类中“最大”的异常。如示例中FileNotFoundException与IOException都属于IO异常,故B中需是IOException或“更大”的异常,而不能是FileNotFoundException。
这一种写法的另一个好处是:程序会自动关闭资源。
最后
暂无言。
本文完结。