先抛出经过测试验证的结论,等会大家可复制代码测试下:
结论:
1. finally 里 始终会被执行到, System.exit(0); 除这种被执行外。即使是发现了异常,如(3)中被注释的throw 异常,也会在抛异常前先执行finally.
2. 即使try中有return ,也是先执行 return 后面的语句完了之后, 不立马return,而是去执行finally中的语句。
3. 当try中与finally里,同时出现return , 则只会返回 finally 中的return 结果。
4. finally中的值不能影响try中 即将返回的结果值。
以上对try中与finally中的结论,同样适用于catch 与 finally里,
1. finally 里 始终会被执行到, System.exit(0); 除这种被执行外。即使是发现了异常,如(3)中被注释的throw 异常,也会在抛异常前先执行finally.
2. 即使catch中有return ,也是先执行 return 后面的语句完了之后, 不立马return,而是去执行finally中的语句。
3. 当catch中与finally里,同时出现return, 则只会返回 finally 中的return 结果。
4. finally中的值不能影响catch中 即将返回的结果值。
注意: 若finally中没有return 在 try或catch中有return , 那么在执行return 跟着语句之后,会把语句的结果新开辟一内存空间,直接把结果的存放此内存空间中。所以,finally中的值 不能影响try或catch中即将return的结果
------------下面是测试代码--------------------- public class TestTry1
- {
- public static void main(String[] args) throws Exception{
- System.out.println("client execute1 ------"+TestTry1());
- }
- public static Person TestTry1() throws Exception{
- int i = 1;
- /*
- try{
-
- return ++i; // xxx 语句 (1)
- }catch(Exception e){
-
- System.out.println("1--------------");
- return 0 ;
- }finally{
- ++i;
- System.out.println("finally1 execute-------- i="+i); // 流程执行try 中语句后 会先回到finally中先执行此中语句
- // 但有个特性时,finally里的 i 重新赋值不影响try 里的return ,因这里的块语句,在(1)语句后,此中块被内存释放了
- // 所以 会先重新申请一内存地址 存放i=2的值 , 程序再在finally中改变i的值 ,已经没有影响了,两者独立了。
- }
- */
- try{
- //throw new Exception();
- //System.exit(0);
- return new Person(++i,"try1"); //(1)
-
- }catch(Exception e){
- System.out.println(" catch run --------, this can not possible"); // (2)
- //throw e ;
- return new Person(i,"catch1"); // (3)
- }finally{
- ++i;
- new Person(i,"finally1"); // (4)
-
- }
- /*
- 流程是先执行 (1),执行(1)之后,不会立马return 回去,而是去执行了(4)呢,
- 执行(4) 后了之后, 才会直接 return 个 try 中 Person 回去。
-
- 若 (4) 前面 加了 return时,此时会返回 finally中的Person 回去,不会返回try 中的Person 回去。
- 结论:
- 1. finally 里 始终会被执行到, System.exit(0); 除这种被执行外。即使是发现了异常,如(3)中被注释的throw 异常,也会在抛异常前先执行finally.
- 2. 即使try中有return ,也是先执行 return 后面的语句完了之后, 不立马return,而是去执行finally中的语句。
- 3. 当try中与finally里,同时出现return , 则只会返回 finally 中的return 结果。
- 4. finally中的值不能影响try中 即将返回的结果值。
- 以上对try中与finally中的结论,同样适用于catch 与 finally里,
- 1. finally 里 始终会被执行到, System.exit(0); 除这种被执行外。即使是发现了异常,如(3)中被注释的throw 异常,也会在抛异常前先执行finally.
- 2. 即使catch中有return ,也是先执行 return 后面的语句完了之后, 不立马return,而是去执行finally中的语句。
- 3. 当catch中与finally里,同时出现return, 则只会返回 finally 中的return 结果。
- 4. finally中的值不能影响catch中 即将返回的结果值。
- 注意: 若finally中没有return 在 try或catch中有return , 那么在执行return 跟着语句之后,会把语句的结果新开辟一内存空间,直接把结果的存放此内存空间中。
-
- */
- }
-
- }
- class Person
- {
- private int num = 0;
- private String location ;
- public Person(int num,String location){
- this.num = num;
- this.location = location;
- System.out.println("------ "+location+" Person can execute---------- num="+num);
-
- }
- public String toString(){
-
- return "{Person num=["+num+"]+ location=["+location+"]" ;
- }
- }
复制代码 |