首页 > 编程知识 正文

finally什么时候执行,java finally return 执行顺序

时间:2023-05-06 19:51:44 阅读:114741 作者:64

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块运行。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。