参考文章
①关于finally代码块的抛出异常问题
②finally代码块一定会执行吗?
一、关于try catch中抛异常的问题
1、try catch 代码块中的finally中很不建议抛异常,可用log打印到日志中
代码如下:
public static void throwException(){
File file = null;
FileInputStream fis = null;
try{
file = new File("123.txt");
fis = new FileInputStream(file);
fis.read();
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
} finally{
// 这里存在一个的异常,需要进行处理
try {
if(fis != null){
fis.close();
}
} catch (IOException e) {
log.error("关闭连接异常",e);
}
}
}
2、也可以把catch放在最外层
public static void throwException(){
File file = null;
FileInputStream fis = null;
try{
try {
file = new File("abc.txt");
fis = new FileInputStream(file);
fis.read();
} finally {
if(fis != null){
fis.close();
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
建议只要是打印异常信息的时候:
- 不要使用
e.printStackTrace();
(因为这种方式会把异常信息存在内存中,开发大忌。抛出的信息会很多,刷控制台,占内存。会引发字符串常量池所在的内存块没有空间) - 可以用
log.error();
代替打印到日志中。(强烈建议)
PS:上面例子中的e.printStackTrace();
举例方便下,其实很不可取。
二、关于try catch finally中的return关系
finally中的代码一定会被执行(以下特殊情况除外:还没执行到try代码块就return或者终止;执行到finally代码块断电宕机等)
- try catch中的return只是先将值保存下来,等finally块执行完,才会return。
- 当try中报异常后,不会执行try的return,会被catch捕获,并return catch的值。
- 但如果finally中也有return语句,则try catch中被覆盖,采用finally块的。
- 如果finally块没有return语句,那即使对try catch块中的return值做更改,也不会改变最终的return值。
例子如下: