最近写了一个bug:(以下为网上找的例子)
try {
FileOutputStream fos = new FileOutputStream("d:\\a.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw = new BufferedWriter(osw);
bw.write("java IO close test");
// 从外到内顺序关闭ok
if (bw != null) {
bw.close();
}
if (osw!= null) {
osw.close();
} if (fos!= null) {
fos.close();
}
}catch (Exception e){
}
看似流已经关闭了,也try了有什么问题呢?
现在有一种情况
当我们关第一个流时出了异常然后catch捕获异常,但是我们总共需要关闭三个流后面的两个流并没有及时关闭就可能会出现内存溢出的情况,所以我确实是把测试环境的服务给撑挂了,也得亏还没有上线。
正确写法
finally {
try{
if(osw!= null){
osw.close();
}
}catch(Exception e){
}
try{
if(fos!= null){
fos.close();
}
}catch(Exception e){
}
}
每一次关闭流我们都单独进行一次try,而且需要写在finally中保证异常了也要执行,不要嫌弃代码繁琐因为这是必须的内容。
可能一个这样不起眼的小问题就会撑爆一套服务,然后各个服务又是互相调用,这下好了一个小小的细节公司的一套业务线都挂了,然后一群人开始排查问题,最后就是因为流关闭没有处理好,所以细节不可小视。