当代码抛出一个异常时,就会终止这个方法中剩余代码的处理,并退出这个方法的执行。如果方法获得了一些本地资源。并且只有这个方法自己知道,又如果这些资源在退出方法之前必须被回收,那么就会产生资源回收问题一种解决方案时捕获异常并重新抛出所有异常,但是这种方法比较乏味,这是因为需要在两个地方清除所分配的资源,一个在正常的代码中,一个在异常代码中。
java有一种更好的解决方案
finally子句
下面介绍如何恰当的关闭一个文件,在发生异常时恰当的关闭所有数据库连接是非常重要的。
如果catch语句抛出一个异常,异常将被抛回这个方法的调用者
不管是否有异常被捕获,finally子句中的代码都被执行。
finally语句不写在catch里,因为没有异常时是不会执行catch的
try语句可以只有finally语句而没有catch语句
InputStream in=...;
try{
code that might throw exceptions
}
finally{
in.close();
}
无论在try语句块中是否遇到异常,finally子句中的in.close()语句都会被执行
InputStream in=...;
try{
try{
code that might throw exceptions
}
finally{
in.close();
}
}
catch(IOException e){
show error message
}
当finally子句包含return语句时,将会有一种意想不到的结果。假设利用return语句从try语块中退出,在方法返回前,fianlly子句的内容将会被执行。如果finally子句中也有一个return语句,这返回值将会覆盖原始的返回值。
例如
public static int f(int n){
try{
int r=n*n;
return r;
}
fianlly{
if(n==2)
return 0;
}
}
在上述代码中调用f(2),在try语句中语句块的计算 结果r=4,并执行return语句,但是在真正返回前,还要执行finally语句,finally语句使得方法返回0,这个值将覆盖原来的返回值,所以返回0.