关于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
相关文章
|
2月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
90 2
|
2月前
|
Java 程序员 数据库连接
Java执行顺序大揭秘:静态块、非静态块和构造方法谁先谁后?
本文详细介绍了Java中的初始化块,包括静态初始化块和非静态初始化块的概念、执行顺序和实际应用场景。通过具体示例,帮助读者理解这两种初始化块的区别和使用场景,让面试官对你刮目相看。
41 0
Java执行顺序大揭秘:静态块、非静态块和构造方法谁先谁后?
|
3月前
|
Java
java中父类方法return this.对象还是变量,子类去调用this.这个方法的问题
本文探讨了在Java中,当父类的方法返回`this`对象或变量时,子类调用该方法的行为,以及`this`关键字在不同类中调用方法时的指向问题。
23 0
java中父类方法return this.对象还是变量,子类去调用this.这个方法的问题
|
3月前
|
缓存 安全 Java
Java中 final、finally、finalize 有什么区别?
本文详细阐述了Java中`final`、`finally`和`finalize`的区别:`final`用于修饰类、方法和变量以表示不可变性;`finally`是用于确保在`try-catch`结构中无论是否发生异常都能执行的代码块;而`finalize`是`Object`类的方法,用于在对象被垃圾回收前执行清理工作,但在JDK 9中已被标记为弃用。
76 0
Java中 final、finally、finalize 有什么区别?
|
8月前
|
Java
Java中return的两种用法
Java中return的两种用法
|
8月前
|
Java API
【JAVA】final、finally、finalize 有什么区别?
【JAVA】final、finally、finalize 有什么区别?
|
5月前
|
Java
【Java基础面试三十九】、 finally是无条件执行的吗?
这篇文章解释了Java中的finally块的特性,即无论是否发生异常或执行了return语句,finally块都会无条件执行,除非使用System.exit()退出虚拟机。
|
5月前
|
Java 数据安全/隐私保护
Java代码的执行顺序和构造方法
构造方法是类的一种特殊方法,用于初始化新对象。在 Java 中,每个类默认都有一个与类名同名的构造方法,无需返回类型。构造方法不能用 static、final、synchronized、abstract 或 native 修饰。它可以重载,通过不同的参数列表实现多种初始化方式。构造方法在对象实例化时自动调用,若未显式声明,默认提供一个无参构造方法。构造代码块和静态代码块分别用于对象和类的初始化,按特定顺序执行。
44 0
|
5月前
|
Java
【Java基础面试四十】、在finally中return会发生什么?
文章讨论了在Java中finally块中使用return语句的问题,指出如果在finally块中使用return或throw语句,将导致try块或catch块中的相应语句失效,因为finally块中的return或throw会终止方法,之后系统不会再执行try或catch块中的代码。
|
6月前
|
Java
java中return,break以及continue的用法
java中return,break以及continue的用法
64 10