1 .为什么要使用finally
首先,让我们看看没有finally的异常处理try-catch语句。
假设需要在count使用的资源中释放已使用的资源。 在中,将释放资源的语句放入try-catch中执行。 无论是执行try语句块还是执行catch语句块,当前程序都将按顺序执行直到释放以下资源的语句:
intcount=0; //资源初始化
try{
出局;
if (计数==1) throw new exception (exceptionintry );
}catch(exceptione ) {
system.out.println(catchblock );
}
计数=0; //释放资源
但是,如果try或catch中有多个return语句,请在每个return语句之前执行释放资源的语句。
公共语音(throws exception )。
intcount=0; //资源初始化
try{
代沟;
statementMayCauseException; //可能会抛出异常的语句,但如果没有catch异常,直接抛出也不会执行到try-catch下的语句
代沟;
if (计数==1) thrownewexception1(E1intry );
if (计数==2) thrownewexception2(e2intry );
} Catch (执行1 e ) )。
计数=0; //释放资源
throwe //再次抛出异常,使之捕获到上一个水平。 在这种情况下,不会执行catch以外的语句,因此请释放资源
}catch(exception2e ) )
计数=0; //释放资源
返回; //返回后,不执行catch以外的语句,所以先释放资源
}
计数=0; //释放资源
}
这样,在所有可能返回的地方,以及所有可能出现异常且程序跳跃的地方,都需要考虑如何释放资源,使其变得复杂和冗馀。
所以,需要finally语句。
将资源释放或状态恢复代码放在finally块中可以确保在执行try和catch语句后始终执行finally语句块,而无需考虑各种复杂的跳转情况。
intcount=0;
try{
出局;
if (计数==1) thrownewException );
}catch(exceptione ) {
}finally{
计数=0;
}
2.finally何时运行
finally在return语句后、跳转到更高级别的程序前执行。
公共类测试{
publicstaticvoidmain (字符串[ ] args ) {
system.out.println(test ) );
}
publicstaticStringtest (
try{
system.out.println(tryblock );
返回测试1 (;
}finally{
system.out.println (finally block );
//return'finally ';
}
}
publicstaticStringtest1(
system.out.println (返回语句);
返回'后返回';
}
}
结果:
三区块
返回语句
金融区块
后返回
分析:
1 .调用try语句块、returntest1 )和test1方法
2 .执行2.test1 ()后,返回“afterreturn”,返回值“afterreturn”保存在临时区域
执行finally语句块。 如果finally语句具有返回值,则此返回值将替换临时区域中的返回值
4 .将临时区域的返回值发送到上层方法。
测试正确:如果finally语句具有返回值,则此返回值将替换临时区域中的返回值
参考:
《thinkinginJava》
3358 blog.csdn.net/mymy way/article/details/7954549
2、验证finally实际执行的顺序
打包lee;
importjava.io.*;
公共类测试1 {
publicstaticvoidmain (字符串argv [ ] ) {
Test1m=newTest1 (;
system.out.println(m.amethod );
}
公共inta方法(
try{
fileinputstreamdis=new file inputstream (hello.txt ); //1,投异常
}catch(exceptionex ) {
system.out.println (nosuchfilefound ); //2 .捕捉并执行catch异常
返回- 1; //4,返回
}finally{
system.out.println (doing finally ); //3.finally必须运行,在返回之前。 (准确地说,返回; 语句)
}
返回0;
}
}
输出结果如下。
Nosuchfilefound
刁金融
-1
总结: finally其实只有返回; 在语句执行之前执行,如果返回一个函数,则首先执行函数,但在函数内(返回; (文,那么finally在这里(return; )在语句之前执行。
PS:catch块有异常时,执行顺序是?我执行,说你扔你有异常,我把我的句子finally,我们互不干涉,你不介意我什么时候执行,但是我一定会执行的父母。==
关于finally,应该在这个时候就清楚了。 请记住,只要不通过调用system.exit (退出程序或关闭电源,任何因素都会导致finally块运行。