关于Java中try catch finally throw return的执行顺序问题

简介:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
try  {
     
     normal statement;      //1.
     
     exception occurred;    //2.
     
     return  "try" ;
     
catch  (Exception ex) {
 
     normal statement;      //3.
     
     return  "catch" ;
     
finally  {
     
     normal statement;      //4.
     
     return  "finally" ;      //5. -->End
     
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
try  {
     
     normal statement;      //1.
     
     exception occurred;    //2.
     
     return  "try" ;
     
catch  (Exception ex) {
 
     normal statement;      //3.
     
     return  "catch" ;        //5. -->End
     
finally  {
     
     normal statement;      //4.
     
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
try  {
     
     normal statement;      //1.
     
     exception occurred;    //2.
     
     return  "try" ;
     
catch  (Exception ex) {
 
     normal statement;      //3.
     
     throw  Exception;
     
finally  {
     
     normal statement;      //4.
     
     return  "finally" ;      //5. -->End
     
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
try  {
     
     normal statement;      //1.
     
     exception occurred;    //2.
     
     return  "try" ;
     
catch  (Exception ex) {
 
     normal statement;      //3.
     
     throw  Exception;
     
finally  {
     
     normal statement;      //4.
     
     throw  Exception;       //5. -->End
     
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
try  {
     
     normal statement;      //1.
     
     exception occurred;    //2.
     
     return  "try" ;
     
catch  (Exception ex) {
 
     normal statement;      //3.
     
     throw  Exception;       //5. -->End
     
finally  {
     
     normal statement;      //4.
     
}


结论:

1、Try-catch-finally中的finally一定会执行,而且,一定优先于try/catch中的return/throw语句执行,除非系统崩了或者程序使用System.exit(0)强行终止;

2、finally中如果有return或throw,则优先处理finally中的return/throw;

3、return和throw,从语句流转的角度上看,这两个语句是等效的;

4、finally中没有return或throw,则程序会回溯到try/catch中执行return/throw语句。如果当初是catch=>finally,则回溯到catch中执行return/throw;如果是try=>finally,则回溯到try中执行return/throw;如果try/catch中都不存在return/throw,则跳出try-catch-finally语句体继续执行后续代码。




本文转自 rickqin 51CTO博客,原文链接:http://blog.51cto.com/rickqin/1868754
相关文章
|
Java UED 开发者
Java异常处理新玩法:throw关键字,你的错误管理利器!
Java异常处理新玩法:throw关键字,你的错误管理利器!
170 1
|
前端开发 Java 开发者
Java高手的秘籍:throw关键字,让异常处理游刃有余!
Java高手的秘籍:throw关键字,让异常处理游刃有余!
215 1
java构造方法,构造代码块,静态代码块的执行顺序
本文介绍了Java中构造方法、构造代码块和静态代码块的执行顺序。静态代码块用`static`声明,在JVM加载类时执行一次;构造代码块在每次创建对象时执行,先于构造方法;构造方法用于对象初始化,创建对象时调用。示例代码展示了这三者的输出顺序,并解释了它们的区别和应用场景。
463 1
|
人工智能 小程序 Java
【Java】throw异常后代码还执行吗?80%小伙伴竟然不知道
本文通过具体的Java代码示例,探讨了Java异常处理机制下的程序流程变化,包括未使用try-catch时异常导致流程中断、使用try-catch捕获异常后的不同执行路径、循环中的异常处理以及throw抛出异常后的代码执行情况。总结了异常处理的关键点,强调了finally块的重要性。
464 4
【Java】throw异常后代码还执行吗?80%小伙伴竟然不知道
|
Java 程序员 数据库连接
Java执行顺序大揭秘:静态块、非静态块和构造方法谁先谁后?
本文详细介绍了Java中的初始化块,包括静态初始化块和非静态初始化块的概念、执行顺序和实际应用场景。通过具体示例,帮助读者理解这两种初始化块的区别和使用场景,让面试官对你刮目相看。
277 0
Java执行顺序大揭秘:静态块、非静态块和构造方法谁先谁后?
|
Java
java中父类方法return this.对象还是变量,子类去调用this.这个方法的问题
本文探讨了在Java中,当父类的方法返回`this`对象或变量时,子类调用该方法的行为,以及`this`关键字在不同类中调用方法时的指向问题。
190 0
java中父类方法return this.对象还是变量,子类去调用this.这个方法的问题
|
Java 开发者 UED
Java异常处理进阶:throw关键字,打造坚不可摧的错误防御体系!
在 Java 开发中,异常处理至关重要,`throw` 关键字是其中的关键武器,帮助开发者主动抛出异常,构建强大的错误防御体系。本文通过技术博客形式,详细介绍 `throw` 的使用方法及其在业务逻辑中的实战应用,如电商系统订单金额验证,并演示如何利用 `throw` 构建异常链,实现完整的错误信息传递。通过这些技巧,你可以大幅提升 Java 应用的稳定性和用户体验。
184 3
|
网络协议 Java 数据库连接
13 Java异常(异常过程解析、throw、throws、try-catch关键字)
13 Java异常(异常过程解析、throw、throws、try-catch关键字)
430 2
|
Java
java中return,break以及continue的用法
java中return,break以及continue的用法
461 10
|
Java 开发者 UED
【实战攻略】Java异常处理进阶:throw关键字,打造坚不可摧的错误防御体系!
【6月更文挑战第19天】在Java中,`throw`关键字用于主动抛出异常,特别是在检测到错误条件如非法参数时。通过`throw`,开发者能控制何时中断程序并提供清晰的错误信息。例如,在验证订单金额时,如果金额小于等于零,可以抛出`IllegalArgumentException`。此外,`throw`还可用于构建异常链,保留错误上下文,便于问题追溯。掌握`throw`使用,是构建健壮异常处理和提升用户体验的关键。
335 6