在 java 中使用 finally
Use of finally in java
考虑代码
try{
//code
} catch(Exception e) {
// handle
} finally {
// close open connections
}
还有这个
try{
//code
} catch(Exception e) {
// handle
}
// close open connections
既然都是一样的,finally块的必要性是什么?
finally
块将始终执行,即使您没有捕获 catch
块中 try
块抛出的所有异常,或者如果 catch
块抛出一个新的异常。
在第二个片段中,如果 try
或 catch
块抛出未捕获的异常,则不会执行 try
-catch
块之后的代码通过 catch
块。
finally
块更安全,因为即使 try
块抛出 catch
块或 [=14] 块未处理的异常,它也能保证执行=]秒。
它还有将所有 "cleanup" 代码组织在预期位置的副作用,使代码(可以说)更易于维护。
顺便说一句,值得注意的是,如果您使用的是 Java 7 或更高版本,并且您正在处理的资源是 AutoCloseable
(such as a java.sql.Connection
, for example), there's an even cleaner solution - the try-with-resource syntax,这会为您省去明确的麻烦关闭资源:
try (Connection con = /* something */) {
// code
} catch (SomeException e) {
// handle
// If there's nothing intelligent to do, this entire clause can be omitted.
}
finally块用于执行关闭连接、流等重要代码。java中的finally块可用于放置"cleanup"关闭文件、关闭连接等代码。
Java 无论是否处理异常,finally 块总是被执行。
对于每个 try 块,可以有零个或多个 catch 块,但只有一个 finally 块。
如果程序退出(通过调用 System.exit() 或导致导致进程中止的致命错误),则不会执行 finally 块。
考虑代码
try{
//code
} catch(Exception e) {
// handle
} finally {
// close open connections
}
还有这个
try{
//code
} catch(Exception e) {
// handle
}
// close open connections
既然都是一样的,finally块的必要性是什么?
finally
块将始终执行,即使您没有捕获 catch
块中 try
块抛出的所有异常,或者如果 catch
块抛出一个新的异常。
在第二个片段中,如果 try
或 catch
块抛出未捕获的异常,则不会执行 try
-catch
块之后的代码通过 catch
块。
finally
块更安全,因为即使 try
块抛出 catch
块或 [=14] 块未处理的异常,它也能保证执行=]秒。
它还有将所有 "cleanup" 代码组织在预期位置的副作用,使代码(可以说)更易于维护。
顺便说一句,值得注意的是,如果您使用的是 Java 7 或更高版本,并且您正在处理的资源是 AutoCloseable
(such as a java.sql.Connection
, for example), there's an even cleaner solution - the try-with-resource syntax,这会为您省去明确的麻烦关闭资源:
try (Connection con = /* something */) {
// code
} catch (SomeException e) {
// handle
// If there's nothing intelligent to do, this entire clause can be omitted.
}
finally块用于执行关闭连接、流等重要代码。java中的finally块可用于放置"cleanup"关闭文件、关闭连接等代码。
Java 无论是否处理异常,finally 块总是被执行。
对于每个 try 块,可以有零个或多个 catch 块,但只有一个 finally 块。 如果程序退出(通过调用 System.exit() 或导致导致进程中止的致命错误),则不会执行 finally 块。