首页 > 编程知识 正文

try catch finally作用,finally什么时候执行

时间:2023-05-04 14:35:12 阅读:114733 作者:3087

示例1 :

公共静态字符串hello (

String s='商务';

try {

返回s;

}catch(exceptione ) {

返回' catch进来了';

} finally {

s='你好世界';

返回s;

}

}

结果:你好世界,此时的返回顺序是finally try

示例2 :

公共静态字符串hello (

String s='商务';

try {

返回s;

}catch(exceptione ) {

返回' catch进来了';

} finally {

s='你好世界';

}

}

结果:返回业务

因为try会进行s值的缓存

示例3 :

公共静态语音hehe (

int a=10;

try {

a =1;

系统. out.println (a;

throw new exception (路径测试);

}catch(exceptione ) {

e .打印堆栈跟踪(;

a =10;

系统. out.println (a;

} finally {

a =10000;

系统. out.println (a;

}

系统. out.println (a;

}

返回结果:

11

21

10021

10021

故意用try抛出异常进入catch。 在这种情况下,返回的顺序是try catch finally中最后一行的代码

补充知识: Java异常获取中的try-catch-finally块的执行顺序

最近看了面试问题,发现了这个比较开心的,try-catch-finally块执行顺序的问题。

finally被认为是最后一次运行、结束工作,最后finally工作,无论try块是否捕获到异常。 但是,这还是笼统的,没有catch,抛出异常让其他方法处理的话,是先进入其他方法,还是先执行finally? 如果try块包含返回,finally是否仍要执行? 此外,如果try和finally都有返回,那么执行是什么过程?

确实,异常的这些是最初学Java的时候学的,但当时好像没那么想。 趁此机会研究一下获取异常的步骤吧。

节约时间,直接结论:

try-catch-finally按顺序运行,不管是否存在异常,不管try有什么操作,还是return,都在稍后一点。 最后这个方法必须运行finally。

如果try抛出异常,并且异常被处理为顶级方法,则抛出后仍将运行finally并返回顶级方法。

当然,如果try中有返回――也是回溯,返回值存在于堆栈中等待,在finally执行后回溯。

另一方面,如果finally具有返回,则直接从finally退出方法。

如果要直接使用方法退出程序,也就是调用System.exit ()方法,请直接退出。 在这种情况下,不执行finally。 据此,我们认为特殊情况下程序的终止可能会引起一些问题。 毕竟finally一般都在写关闭对象、资源的代码。

通过代码分析:

首先,我写了一个包含很多情况的例子:

package me.iwts;

公共类主{

公共静态内通道;

公共静态语音解决方案1 () throws Exception{ )。

try {

system.out.println(Solve1try,rank: ) rank );

throw new exception (throwbysolve1);

}finally {

system.out.println (solve1finally,rank: ) rank );

}

}

公共静态语音解决方案2 (

try{

系统. out.println (solve2try,rank: ) rank );

解决方案1 (;

>

}catch (Exception ex){

System.out.println("catch exception : "+ex.getMessage()+",rank: "+rank++);

}finally {

System.out.println("solve 1 finally,rank: "+rank++);

}

}

public static void main(String args[]) {

rank = 1;

solve2();

System.out.println("over");

}

}

rank是计数。可以看到,整体上是先调用solve2方法,在其中调用solve1,solve1抛出了一个异常,让solve2捕获处理。大家可以先自己猜一下。

下面是返回答案:

solve 2 try,rank: 1

solve 1 try,rank: 2

solve 1 finally,rank: 3

catch exception : throw by solve 1,rank: 4

solve 1 finally,rank: 5

over

根据上面的结果可以分析:try-catch-finally执行顺序:首先是try执行,如果发生异常,那么直接捕获异常,最后执行finally。但是,如果抛出异常,例如在solve1方法中,throw了一个异常,那么不会立刻回溯到上一个方法,而是仍然执行finally。

通过solve1的执行,我们可以认为,finally之前的所有代码,正常执行,但是返回之类的,全部被“卡”了下来,只有在finally执行之后,才能继续执行。

这里就又有疑惑了,一般认为throw了一个异常,就算是回溯了,为什么finally仍然执行了?如果这个不够明显,那么再看这个代码:

package me.iwts;

public class Main{

public static int solve(){

try{

System.out.println("try");

return 1;

}finally {

System.out.println("finally");

return 2;

}

}

public static void main(String args[]) {

System.out.println(solve());

}

}

返回值是多少?

try

finally

2

try块都已经return了,最后为什么是返回的return2?并且try块确实是运行了。再改一下代码:

package me.iwts;

public class Main{

public static int solve(){

int i = 1;

try{

System.out.println("try");

return i++;

}finally {

System.out.println("finally");

return i;

}

}

public static void main(String args[]) {

System.out.println(solve());

}

}

注意,try块返回了i++,那么我们debug就能看出来return这句到底是执行还是没执行,那么有这样的图:

可以看到,return确实是执行的。

所以,认为finally是无论怎样一定在方法的最后结束前执行的。搜了一些资料,是说finally会在方法结束之前执行,而之前所有的执行,包括return,全部都停留在栈中,而finally最终执行后才继续。所以这样也能解释,第一次代码本应该回溯的代码执行完finally后才回溯,return的时候也是等finally执行之后再执行。

或许“return的时候也是等finally执行之后再执行”这句话又引出了一个问题:finally究竟是直接运行完结束,还是运行完之后再回到原来return的地方?

这里我们可以把i++换成++i,结果就不截图了――finally就是最终执行,如果有return,直接从finally返回。

还有一种情况,直接结束程序会怎么样?

package me.iwts;

public class Main{

public static void solve(){

try{

System.out.println("try");

System.exit(0);

}finally {

System.out.println("finally");

}

}

public static void main(String args[]) {

solve();

}

}

结果:

try

强制结束大过天。由此,也可以认为特殊情况导致程序直接结束,不会执行finally。因为finally一般写的都是关闭对象、资源的代码,所以这些特殊情况导致的程序强制结束,可能会引发一些问题的。

以上这篇Java.try catch finally 的执行顺序说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持云海天教程。

原文链接:https://blog.csdn.net/qq_45239139/article/details/104849154

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