当我们可以使用这种结构时,有人能解释一些情况(例子)吗?
try{
//dangerous code here
} finally {
//always called
}
我真的明白它是如何运作的,但在实际情况下更新。
答案 0 :(得分:3)
几乎每当你有Closeable
之类的东西,你需要显式调用close()
来释放底层资源时,你想把这个调用放在finally
块中,像:
FileReader f = whatever();
try {
// do some stuff with f
return;
}
finally {
f.close();
}
即使没有抛出异常,并且运行return
块内的try
,资源仍将正确关闭。
答案 1 :(得分:2)
一些常见情况:
答案 2 :(得分:2)
您可以使用它来关闭数据库连接或任何其他资源 - 文件,硬件端口等
try{
// Do something I care about
} finally {
// Make sure we clean up, regardless of success or failure
}
答案 3 :(得分:2)
以下是一个例子:
InputStream in = new FileInputStream(...);
try {
/ * use in here */
} finally {
in.close();
}
基本上,无论发生什么,in
将永远关闭。如果没有这个,in
可以保持打开,直到垃圾收集器收集它(可能是长时间)。这是一个问题,因为:
答案 4 :(得分:2)
例如,当您阅读文件时:
InputStream is = new FileInputStream("...");
try {
// do stuff
}
finally {
is.close();
}
这样,即使出现异常,您的文件也会一直关闭。
答案 5 :(得分:2)
openFile();
try {
int i = Integer.parseInt(someString);
String sub = someString.substring(2);
System.out.println(i+sub);
}
finally {
closeFile();
}
正如您所看到的,在代码段落中可能会抛出几个异常,并且您可能不希望捕获每个异常。
也可能会抛出错误,你不应该抓住它!
以任何方式你想要在方法结束之前关闭你的文件,所以你把它放在finally块中
答案 6 :(得分:2)
看看这篇文章Java Exception Handling - Basics。这里清楚地描述了异常及其使用的位置。
答案 7 :(得分:2)
这是一种非常常见的模式:
InputStream stream = // acquire stream...
try {
// do stuff with stream that might throw...
}
finally {
IOUtils.closeQuietly(stream);
}
注意,IOUtils是来自Apache Commons项目的库。您应始终在finally
中关闭该流。 closeQuietly
会尝试关闭流时可能抛出的任何异常(这是正常的,因为您无法对其执行任何操作)。
答案 8 :(得分:2)
特别是我们可以在finally块中使用数据库连接关闭相关代码。如果程序在这种情况下抛出任何异常,则DB连接将释放。
这是JDBC.same中的示例,可以在Hibernate中的session.close()中使用。 试试{
//dangerous code here
} catch(Exception e){
//Do some thing releted to your exception
} finally {
//close DB connection or close your hibernate session.
//always called
}
答案 9 :(得分:2)
好吧,假设您打开了与数据库的连接并进行了一些查询。如果其中一个查询引发SQLException
,则应该在执行其他操作之前关闭连接。如果没有引发异常,你仍然应该关闭它。
因此,try {} catch () {}
可以捕获那些SQLExceptions
并对它们做些什么,而finally {}
可以在任何一种情况下关闭连接。
这将是一种非常常见的情况,但无论在使用它时发生什么,都需要释放任何资源,情况也是如此。
答案 10 :(得分:2)
try {
isWorking = true
//doStuff that might or might not succeed
} finally {
isWorking = false;
}
另一个例子:
public void actionPressed()
{
if( isLoading )
return;
try {
isLoading= true;
doTheLoad);
} finally {
isLoading = false;
}
}