try--catch--finally中return返回值执行的顺序(区别)

1、try块中没有抛出异常,try、catch和finally块中都有return语句


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

public static int NoException(){

         int i=10;

         try{

           System.out.println("i in try block is:"+i);

           return --i;

         }

         catch(Exception e){

           --i;

           System.out.println("i in catch - form try block is:"+i);

           return --i;

         }

         finally{     

           System.out.println("i in finally - from try or catch block is:"+i);

           return --i;

         }  

}

运行代码:


1

2

3

4

5

public static void main(String[] args) {

        System.out.println("=============NoException==================");

        System.out.println(NoException());

        System.out.println("===============================");   

}

运行结果:


1

2

3

4

5

=============NoException==================

in try block is10

in finally - from try or catch block is9

8

===============================

执行顺序:

执行try块,执行到return语句时,先执行return的语句,--i,但是不返回到main方法,执行finally块,遇到finally块中的return语句,执行--i,并将值返回到main方法,这里就不会再回去返回try块中计算得到的值。

结论:try-catch-finally都有return语句时,没有异常时,返回值是finally中的return返回的。

2.try块中没有抛出异常,仅try和catch中有return语句


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public static int NoException1(){

            int i=10;

            try{

                System.out.println("i in try block is:"+i);

                return --i;

            }

            catch(Exception e){

                --i;

                System.out.println("i in catch - form try block is:"+i);

                return --i;

            }

            finally{           

                System.out.println("i in finally - from try or catch block is:"+i);

                --i;

                System.out.println("i in finally block is:"+i);

                //return --i;

            }

}

运行结果:


1

2

3

4

5

6

=============NoException1==================

in try block is10

in finally - from try or catch block is9

in finally block is8

9

===============================

执行顺序:

try中执行完return的语句后,不返回,执行finally块,finally块执行结束后,返回到try块中,返回i在try块中最后的值。

结论:try-catch都有return语句时,没有异常时,返回值是try中的return返回的。

3.try块中抛出异常,try、catch和finally中都有return语句


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

public static int WithException(){

            int i=10;

            try{

                System.out.println("i in try block is:"+i);

                i = i/0;

                return --i;

            }

            catch(Exception e){

                System.out.println("i in catch - form try block is:"+i);

                --i;

                System.out.println("i in catch block is:"+i);

                return --i;

            }

            finally{           

                System.out.println("i in finally - from try or catch block is--"+i);

                --i;

                System.out.println("i in finally block is--"+i);

                return --i;

            }

}

执行结果:


1

2

3

4

5

6

7

8

=============WithException==================

in try block is10

in catch - form try block is10

in catch block is9

in finally - from try or catch block is--8

in finally block is--7

6

===============================

执行顺序:

抛出异常后,执行catch块,在catch块的return的--i执行完后,并不直接返回而是执行finally,因finally中有return语句,所以,执行,返回结果6。

结论:

try块中抛出异常,try、catch和finally中都有return语句,返回值是finally中的return。

4.try块中抛出异常,try和catch中都有return语句


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public static int WithException1(){

            int i=10;

            try{

                System.out.println("i in try block is:"+i);

                i=i/0;

                return --i;

            }catch(Exception e){

                System.out.println("i in catch - form try block is:"+i);           

                return --i;

            }finally{

                                                                                                                                                                     

                System.out.println("i in finally - from try or catch block is:"+i);

                --i;

                System.out.println("i in finally block is:"+i);

                //return i;

            }

}

执行结果:


1

2

3

4

5

6

7

=============WithException1==================

in try block is10

in catch - form try block is10

in finally - from try or catch block is9

in finally block is8

9

===============================

执行顺序:

抛出异常后,执行catch块,执行完finally语句后,依旧返回catch中的执行return语句后的值,而不是finally中修改的值。

结论:

返回的catch中return值。

5.try、catch中都出现异常,在finally中有返回


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

public static int WithException2(){

            int i=10;

            try{

                System.out.println("i in try block is:"+i);

                i=i/0;

                return --i;

            }

            catch(Exception e){

                System.out.println("i in catch - form try block is:"+i);

                int j = i/0;

                return --i;

            }

            finally{

                                                                                      

                System.out.println("i in finally - from try or catch block is:"+i);

                --i;

                --i;

                System.out.println("i in finally block is:"+i);

                return --i;

}

执行结果:


1

2

3

4

5

6

7

=============WithException2==================

in try block is:10

in catch - form try block is:10

in finally - from try or catch block is:10

in finally block is:8

7

===============================

执行顺序:

try块中出现异常到catch,catch中出现异常到finally,finally中执行到return语句返回,不检查异常。

结论:

返回finally中return值。

6、只在函数最后出现return语句


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

public static int WithException3(){

            int i=10;

            try{

                System.out.println("i in try block is:"+i);

                i=i/0;

                //return --i;

            }

            catch(Exception e){

                System.out.println("i in catch - form try block is:"+i);

                //int j = i/0;

                //return --i;

            }

            finally{

                                                                         

                System.out.println("i in finally - from try or catch block is:"+i);

                --i;

                --i;

                System.out.println("i in finally block is:"+i);

                //return --i;

            }

            return --i;

}

执行结果:


1

2

3

4

5

6

7

=============WithException3==================

in try block is10

in catch - form try block is10

in finally - from try or catch block is10

in finally block is8

7

===============================

总体结论:

结论一:

return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回)
结论二:

finally里面不建议放return语句,根据需要,return语句可以放在try和catch里面和函数的最后。可行的做法有四:
   (1)return语句只在函数最后出现一次。
   (2)return语句仅在try和catch里面都出现。
   (3)return语句仅在try和函数的最后都出现。
   (4)return语句仅在catch和函数的最后都出现。
   注意,除此之外的其他做法都是不可行的,编译器会报错。

转载自:http://qing0991.blog.51cto.com/1640542/1387200

时间: 2024-10-18 11:40:37

try--catch--finally中return返回值执行的顺序(区别)的相关文章

51.try块和catch块中return语句的执行

import java.util.Scanner; /** * 测试try块和catch块中return语句的执行. */ public class Test5 { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.print("请输入被除数:"); try { int num1 = in.nextInt(); System.out.print("请

js中return返回值小练习

本文只是帮助初学者入门用的 关于js中的返回值return 如果函数中存在return,执行到了那行之后就直接跳出整个函数,接着向下执行 上例子 定义一个函数是否是偶数,如果是返回true,如果不是返回false? 我相信大多数才学的人会这样写 function isOu(num){ if(num%2==0){ return true }else{ return false } } 这样写不是不可以,只是有点啰嗦 因为num%2==0本身就是一个判断,所以 function isOu(num){

try catch finally中return语句与非return语句的执行顺序问题

finally语句一定是会被执行的,不管前边的try块catch块中有无return语句,并且如果finally中存在return语句,这个return语句将会是最后执行的return语句,即函数最后的返回值.try,catch中的return并不是让函数直接返回,而是return语句执行完毕,把返回结果放到函数栈中,转而执行finally块,所以,若是finally中含有return语句,那么函数栈中的返回值将被刷新.看以下几种情况: 1:try有return,finally无 public

C# 调用存储过程操作 OUTPUT参数和Return返回值

本文转载:http://www.cnblogs.com/libingql/archive/2010/05/02/1726104.html 存储过程是存放在数据库服务器上的预先编译好的sql语句.使用存储过程,可以直接在数据库中存储并运行功能强大的任务.存储过程在第一应用程序执行时进行语法检查和编译,编译好的版本保存在高速缓存中.在执行重复任务时,存储过程可以提高性能和一致性.由于存储过程可以将一系列对数据库的操作放在数据库服务器上执行,因而可以降低Web服务器的负载,提高整个系统的性能. 1.创

字节码分析finally块对return返回值的影响

直接进入主题.看如下代码: public int test(){ int i=0; try { i=1; return i; } catch (Exception e) { i=2; return i; }finally{ i=3; } } 相信有点经验的程序员一眼就能说出返回的结果为1,但是您真的知道返回的结果为什么为1吗?下面我们通过分析下当前方法的字节码,来说明为什么. 查看字节码命令:javap -verbose class文件 ? 知识点简单概要:看如下字节码需要简单了解下栈的结构.栈

获取存储过程返回值及代码中获取返回值

获取存储过程返回值及代码中获取返回值 1.OUPUT参数返回值例: 向Order表插入一条记录,返回其标识 CREATE PROCEDURE [dbo].[nb_order_insert](@o_buyerid int ,@o_id bigint OUTPUT)ASBEGINSET NOCOUNT ON;BEGININSERT INTO [Order](o_buyerid )VALUES (@o_buyerid )SET @o_id = @@IDENTITYENDEND 存储过程中获得方法: D

JavaScript函数概述、声明、return 返回值

一.函数的概述: 1.函数是定义一次但却可以调用或执行任意多次的一段 JS 代码.  2.函数有时会有参数,即函数被调用时指定了值的局部变量.  3.函数常常使用这些参数来计算一个返回值,这个值也成为函数调用表达式的值.(简单的说就是完成一个特定功能的代码块).  4.在 javaScript 中,Function(函数)类型实际上是对象.每个函数都是 Function 类型的实例,而且都与其他引用类型一样具有属性和方法.  5.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针. 6.

4.return 返回值

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title> return 返回值 </titl

Asp.net MVC 中Controller返回值类型ActionResult

内容转自 http://blog.csdn.net/pasic/article/details/7110134 Asp.net MVC中Controller返回值类型 在mvc中所有的controller类都必须使用"Controller"后缀来命名并且对Action也有一定的要求: 必须是一个public方法 必须是实例方法 没有标志NonActionAttribute特性的(NoAction) 不能被重载 必须返回ActionResult类型 如: [csharp] view pl