try-catch-finally的含有return使用揭秘

很多人都会纠结这么一个问题try-catch-finally中有return的情况,我自己总结如下:

如果是值类型的话

请看代码

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5
 6 namespace 含有return的测试
 7 {
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             int j = Test();
13             Console.WriteLine(j);
14
15         }
16         /// <summary>
17         /// 这个是测试return里面的是值类型就不会对他们有影响呢
18         /// </summary>
19         /// <returns></returns>
20         static int Test()
21         {
22              int i = 0;
23
24             try
25             {
26
27                 return i; //为什么这里要加个return呢
28             }
29             catch (Exception)
30             {
31
32                 i++;
33                 return i;
34
35             }
36             finally
37             {
38                 i = i + 2;
39             }
40
41         }
42
43
44     }
45 }

通过上面的代码可以看出,这里的finally执行了之后,对return返回没有影响 return返回结果还是0;

以下是返回值是引用类型

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5
 6 namespace 引用类型测试
 7 {
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             List<string> strList = Test();
13              foreach (var i in strList)
14             {
15                 Console.WriteLine(i);
16             }
17             Console.ReadKey();
18         }
19         private static List<string> Test()
20         {
21             List<string> strList = new List<string>();
22             strList.Add("aa");
23             strList.Add("bb");
24             strList.Add("cc");
25             try
26             {
27                 //这里没有发生异常的
28                 strList.Add("trytry");
29                 return strList;
30             }
31             catch (Exception ex)
32             {
33                 strList.Add("zzz");
34                 return strList;
35             }
36             finally
37             {
38                 strList.Add("yyy");
39             }
40         }
41
42     }
43 }

输出结果如下:

通过以上两个例子可以总结出来如果是值类型的话,finally里面的改变不会对try或者catch中的return返回值造成影响。

如果是引用类型的话,finally里面的改变会对try或者catch中的return返回值造成影响。

至于为什么会出现这个结果: 我还在思考中,欢迎大家讨论

时间: 2024-10-14 03:35:41

try-catch-finally的含有return使用揭秘的相关文章

【转】case: Java中try catch finally语句中含有return语句的执行情况(总结版)

Java中try catch finally语句中含有return语句的执行情况(总结版) 有一点可以肯定,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有return语句的话,那么直接从finally中返回了,这也是不建议在finally中return的原因.下面来看这几种情况. 情况一(try中有return,finally中没有return): [java] view plain copy public class TryTest{ public 

Java中try catch finally语句中含有return语句的执行情况

finally块中的内容会先于try中的return语句执行,如果finall语句块中也有return语句的话,那么直接从finally中返回了,这也是不建议在finally中return的原因.下面来看这几种情况. 情况一(try中有return,finally中没有return): public class TryTest{ public static void main(String[] args){ System.out.println(test()); } private static

在aardio的函数里try...catch语句中使用return。

try{ error("错误信息"); //使用error可以抛出一个错误 //如果error函数在try语句中,程序将不会报错,而会直接跳出try语句 } catch(e){ //如果try语句后跟catch语句则可以捕获到这个错误信息e } 以上是try...catch的语法: try语句尝试执行一个语句块,遇到错误则退出try语句块而不是中断aardio程序.如果使用了catch语句块就可以捕获异常(catch语句块是可选的). 以上是在aardio使用手册中的一段话. 也许在使

异常处理中try,else,finally含有return的情况解析

直接看代码,拿到你的py下运行测试一下就 明白了. 例一: def f(): try: print(1) return 3 finally: print(2) return 0 print(f()) #120 若注释掉finally内的return 结果为123 #解释-----一个函数只会有一个返回值,若try和finally同时存在的话,finally会覆盖掉try的return并执行,所以函数结束了. 例二: def f(): try: print(1) return 1 except:

Java中try catch finally语句中含有return语句的执行情况(总结版)

在这里看到了try >但有一点是可以肯定的,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有return语句的话,那么直接从finally中返回了,这也是不建议在finally中return的原因.下面来看这几种情况. 情况一(try中有return,finally中没有return): public class TryTest { public static void main(String[] args) { System.out.println(t

try-catch-finally对返回值的影响

catch 和 finally 一起使用的常见方式是:在 try 块中获取并使用资源,在 catch 块中处理异常情况,并在 finally 块中释放资源. finally 块用于清理try块分配的任何资源,无论try中是否异常或者终止(return),finally块都会执行. 如果在finally块中修改了返回值,会对最终返回的结果有何影响呢? 1,如果返回值是值类型 //finally执行,i值是2013,但是最终返回2015 static int test() { int i = 201

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

Java_try,catch,finally return之间的执行顺序

以往认为函数只要执行到return语句便会返回结果并终止,然而这时错误的,因为这存在特例. 掌握下面几条原则就可以完全解决“当try.catch.finally遭遇return”的问题. 原则:1.finally语句块中的代码是一定会执行的,而catch块中的代码只有发生异常时才会执行. 2. 函数执行完try块中的return语句后不会终止,还会继续执行catch(仅在抛出异常时执行).finally语句块. 3.函数必须确保有唯一返回值 说明: try中如果包含return语句则catch块

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

try {          normal statement;     //1.          exception occurred;   //2.          return "try";      } catch (Exception ex) {     normal statement;     //3.          return "catch";      } finally {          normal statement;