天天看点

Java IO: 异常处理

流与reader和writer在结束使用的时候,需要正确地关闭它们。通过调用close()方法可以达到这一点。不过这需要一些思考。请看下边的代码:

第一眼看这段代码时,可能觉得没什么问题。可是如果在调用dosomethingwithdata()方法时出现了异常,会发生什么呢?没错,这个inputstream对象就不会被关闭。

为了避免异常造成流无法被关闭,我们可以把代码重写成这样:

注意到这里把inputstream的关闭代码放到了finally块中,无论在try-catch块中发生了什么,finally内的代码始终会被执行,所以这个inputstream总是会被关闭。

但是如果close()方法抛出了异常,告诉你流已经被关闭过了呢?为了解决这个难题,你也需要把close()方法写在try-catch内部,就像这样:

这段解决了inputstream(或者outputstream)流关闭的问题的代码,确实是有一些不优雅,尽管能够正确处理异常。如果你的代码中重复地遍布了这段丑陋的异常处理代码,这不是很好的一个解决方案。如果一个匆忙的家伙贪图方便忽略了异常处理呢?

此外,想象一下某个异常最先从dosomethingwithdata方法内抛出。第一个catch会捕获到异常,然后在finally里程序会尝试关闭inputstream。但是如果还有异常从close()方法内抛出呢?这两个异常中得哪个异常应当往调用栈上传播呢?