Java在最终给出错误时关闭IOStream:未处理的异常:java.io.IOException

时间:2014-11-27 15:20:38

标签: java exception-handling

来自C#,我通常在与流交互时使用这种模式(注意我在这里使用Java类,但我指的是C#中的模式):

HttpURLConnection ServiceConnection;
DataOutputStream ConnectionStream;

try {
    ServiceConnection = (HttpURLConnection) ServiceUrl.openConnection();
    ConnectionStream = new DataOutputStream(ServiceConnection.getOutputStream());

    //...
}
finally {
    ConnectionStream.close();
    ServiceConnection.Disconnect();
}

根据我的理解,对于像IOException这样的已检查异常,我需要包含一个catch块。很公平。所以我改变了我的代码如下:

HttpURLConnection ServiceConnection;
DataOutputStream ConnectionStream;

try {
    ServiceConnection = (HttpURLConnection) ServiceUrl.openConnection();
    ConnectionStream = new DataOutputStream(ServiceConnection.getOutputStream());

    //...
}
catch (MalformedURLException e1) {
    //...
}
catch (IOException e) {
    //...
}
finally {
    ConnectionStream.close();
    ServiceConnection.Disconnect();
}

但是,此代码给出了以下错误:未处理的异常:我尝试在finally块中关闭流的行上的java.io.IOException。

我在这里不理解什么?我认为最后块是你应该放置清理代码的地方,我认为在这里关闭流是完美的候选者吗?

1 个答案:

答案 0 :(得分:1)

您可以使用apache的IOUtils库。它有一个叫做安静的方法。

finally {
        IOUtils.closeQuietly(connectionStream);
    }

否则你必须使用try / catch

包围close方法
finally {
        if (connectionStream != null) {
            try {
                connectionStream.close();
            } catch (Exception ignore) {
                // Nothing to do
            }
        }
    }