谈谈Java的try..catch...
我们在写Java的try..catch的时候,往往需要在最后加上finally子句关闭一些IO资源,比如 InputStream is; try{ is=openInputStream(); // do something }catch(IOException e){ e.printStaceTrace(e); }finally{ try{ is.close(); }catch(IOException e ){ } } 但是在使用这种模式时,即使是Java老手,偶尔也会犯一些错误。比如上面这段代码,当openInputStream()函数在执行过程中抛出异常,那么变量is的值仍为null,此时执行is.close()会抛出NullPointerException. 由于NullPoiterException不是IOException的子类,因此它不能被catch块捕获,而是直接往调用层抛出去. 一种改进的写法就是在关闭流的时候先进行非空判断,但这样代码会显得很啰嗦。个人认为比较优雅的写法是直接调用commons-io包提供的IOUtils.closeQuitely()方法关闭流(或者自己封装一个closeQuitely()方法)。 使用这种写法还有一种好处,就是当遇到关闭多个IO资源时不容易出错,比如下面这段代码: InputStream is; OutputStream os ;