因此。我正在尝试在Android上做一些网络工作。在我的异步任务中,我正在做:
InputStream streamOfDestiny = null;
try{
// do some network stuff here...
}
finally{
if(streamOfDestiny != null){
streamOfDestiny.close(); // Build error here. Apparently, closing a stream can cause an IOException. Why this is the case, I do not know. But it is. And, since this is Java, I apparently need to care.
}
}
所以现在我已经把这个IOException搞砸了。我可以这样做:
InputStream streamOfDestiny = null;
try{
// do some network stuff here...
}
finally{
if(streamOfDestiny != null){
try{
streamOfDestiny.close();
}
catch(IOException e){
// Hey look! I'm inside a catch block, inside a finally block!
}
}
}
但这看起来很糟糕。 finally块中的try / catch块?多丑啊!我可以把它放在未封闭的状态,但这对我来说似乎是不好的做法,只是感觉不对(我开始流,我想完成它)。我能做到这一点:
IOUtils.closeQuietly(streamOfDestiny);
但现在我必须找到org.apache.commons.io.IOUtils并以某种方式将其包含在我的包中。太多的工作,加上我的包装尺寸,我只需要一个功能。跛。
我总是可以写自己的closeQuietly版本:
public static void closeStreamQuietly(InputStream streamToClose){
try{
streamToClose.close();
}
catch (IOException e){
// ignore it....
}
}
但这似乎我正在重新发明轮子,这几乎总是坏消息 - 感觉应该有一些漂亮,优雅的方式做到这一点,我在这里完全失踪。
任何想法的人?
答案 0 :(得分:0)
我不确定你为什么要将你的选项-2(最终的try-catch块)或选项-4(创建一个小的util方法)称为丑陋或额外的工作。这是正常的和预期的。
如果您在finally
内编写任何代码,则应完成相关的异常处理,这就是这种情况。
通过null
检查您已经完成(预防性)的一个例外处理,否则当NullPointerException
为空时它可能会抛出streamOfDestiny
。
需要第二个异常处理来处理流关闭的异常情况,这可能是因为Stream为not open
,unavailable
或it's not able to release the underline resources
或类似{{3等等。
答案 1 :(得分:0)
直接从网络上复制IOUtils代码:
此外,习惯finally块中的异常处理。这不是你最后一次看到它。
答案 2 :(得分:0)
没有神秘感。 close()
在大多数实现中调用flush()
(请参阅FilterOutputStream
的Javadoc),flush()
可以抛出IOException,
,因为它可能会执行I / O.其他可能性是可以想象的。
答案 3 :(得分:0)
你应该尝试使用资源。
try (InputStream streamOfDestiny = ...) {
//Do you networking stuff
} catch (IOException ioe) {
//Handle the exceptions
}