基本上我不确定finally关键字的正确用法是什么,我只知道文本定义:保证代码将被执行,因为有时它不会。所以我希望我能就这个特定的代码得到一些指示:
此外,如果try-catch
阻止调用InputStream#close()
是不必要的
try {
inputStream = entity.getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder sb = new StringBuilder();
String line = null;
while((line = br.readLine()) != null) {
sb.append(line);
sb.append("\n");
}
responseText = sb.toString();
} catch(IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:1)
您还可以使用try-with-resources。
像这样:
try (YourResource resource) {
//Todo...
} catch(YourSpecificException ex) {
//Todo...
}
在退出施工后,您在parantheses之间宣布的资源将自动关闭。
您甚至可以一次声明多个资源,用分号分隔它们。这一切都在上面的链接中,真的。
答案 1 :(得分:0)
finally
块将始终执行,无论异常是否来自try
块。所以finally
块用作后期活动。在您用来关闭的代码中流。
答案 2 :(得分:0)
finally块确保无论您在尝试(成功或异常)期间发生什么,它都将始终运行。这通常在清理资源时使用,例如InputStream
或Socket
try with resource
范例清除了这一点,但会自动关闭Closeable
try( InputStream inputStream = entity.getContent() )
{
}catch(Exception e)
{
}//declared resource in try automatically closed
http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
答案 3 :(得分:0)
try {
// Here the guarded area starts
// Here the guarded area ends
} catch {
// This block is executed when an exception occurs inside the guarded area
} finally {
// This block is executed always before leaving try - catch - finally block
// If there is an exception, then first catch block is executed and then finally
}
您拥有的finally
块内的代码是关闭流的常用结构。如果在受保护区域(inputStream != null
)内创建了一个流,那么最后块将关闭它。如果在创建inputStream
之前有异常,则执行finally块,但因为inputStream == null
,if
语句中的代码不会执行。
答案 4 :(得分:0)
当try
块正在执行时,发生的任何异常都会将执行转移到catch
块然后转移到finally
块,但是如果在try中没有发生异常,则执行代码将在尝试finally块之后继续,在您的代码中,您尝试使用IO资源,如果它不能被进程占用则可能引发IO异常,那么将不会将引用分配给inputStream
finally块必须找到在任何情况下关闭IO连接,如果资源被占用或者它是null然后什么都没有,记得最后总是会执行任何情况,最好关闭连接到数据库和其他资源以释放内存有时
答案 5 :(得分:0)
我最终使用的时间通常都是......
try { } finally { super.finalize(); }
)