[英]Java try-finally construction
当我们可以使用这种结构时,有人可以向我解释一些情况(示例)吗?
try{
//dangerous code here
} finally {
//always called
}
我真的很了解它是如何工作的,但是在实际情况下会更新使用。
一些常见方案:
您可以使用它来关闭数据库连接或任何其他资源-文件,硬件端口等。
try{
// Do something I care about
} finally {
// Make sure we clean up, regardless of success or failure
}
这是一个例子:
InputStream in = new FileInputStream(...);
try {
/ * use in here */
} finally {
in.close();
}
基本上,无论发生什么情况, in
都将始终处于关闭状态。 没有这个, in
可能会保持打开状态,直到垃圾收集器将其收集起来(可能会很长一段时间)。 这是一个问题,因为:
例如,当您读取文件时:
InputStream is = new FileInputStream("...");
try {
// do stuff
}
finally {
is.close();
}
这样,即使有异常,文件也始终关闭。
openFile();
try {
int i = Integer.parseInt(someString);
String sub = someString.substring(2);
System.out.println(i+sub);
}
finally {
closeFile();
}
如您所见,在代码传递过程中可能会引发多个异常,并且您可能不想捕获每个异常。
也可能会引发错误,您不应该捕获该错误!
在方法结束之前,以任何方式要关闭文件,因此将其放在finally块中
请参阅本文Java异常处理-基础 。 这里清楚地描述了异常及其使用位置。
这是一个非常常见的模式:
InputStream stream = // acquire stream...
try {
// do stuff with stream that might throw...
}
finally {
IOUtils.closeQuietly(stream);
}
注意, IOUtils是Apache Commons项目中的一个库。 您应该始终在finally
关闭流。 closeQuietly
会尝试关闭流时吃掉任何可能抛出的异常(这是可以的,因为您对此无能为力)。
特别是我们可以在final块中用于数据库连接关闭相关代码。 如果程序在这种情况下引发任何异常,则将断开数据库连接。
这是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
}
好吧,假设您打开了一个数据库连接并进行了一些查询。 如果查询之一引发了SQLException
则应该在执行其他操作之前先关闭连接。 如果没有引发异常,您仍然应该关闭它。 因此, try {} catch () {}
可以捕获这些SQLExceptions
并对其进行处理,而无论哪种情况,都可以使用finally {}
来关闭连接。 这将是非常常见的情况,但是对于任何需要释放的资源,无论使用它时发生了什么,情况都是如此。
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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.