设为首页 | 加入收藏

欢迎访问彩票大赢家软件系统-彩票大赢家走势图新版-彩票大赢家官方软件

双色球彩票大赢家走势图 >> 彩票大赢家软件系统-Java finally句子到底是在return之前仍是之后履行?

网上有很多人讨论Java中反常捕获机制try…catch…finally块中的finally句子是不是必定会被履行?很多人都说不是,当然他们的答复是正确的,通过我实验,至少有两种状况下finally句子是不会被履行的:

(1)try句子没有被履行到,如在try句子之前就回来了,这样finally句子就不会履行,这也阐明晰finally句子被履行的必要而非充分条件是:相应的try句子必定被履行到。

(2)在try块中有System.exit(0);这样的句子,System.exit(0);是中止Java虚拟机JVM的,连JVM都中止了,一切都完毕了,当然finally句子也不会被履行到。

当然还有很多人讨论Finally句子的履行与return的联系,较为让人利诱,不知道finally句子是在try的return之前履行仍是之后履行?我也是一头雾水,我觉得他们的说法都不正确。

我觉得应该是:finally句子是在try的return句子履行之后,return回来之前履行。这样的说法有点对立,也许是我表述不太清楚,下面我给出自己实验的一些成果和示例进行佐证,有什么问题欢迎我们提出来。

1. finally句子在return句子履行之后return回来之前履行的。

public class FinallyTest1 {
publ彩票大赢家软件系统-Java finally句子到底是在return之前仍是之后履行?ic static void main(String[] args) {
System.out.println(test1());
}
public static int test1() {
int b = 20;
try {
System.out.println("try block");
re彩票大赢家软件系统-Java finally句子到底是在return之前仍是之后履行?turn b += 80;
}
catch 彩票大赢家软件系统-Java finally句子到底是在return之前仍是之后履行?(Exception 彩票大赢家软件系统-Java finally句子到底是在return之前仍是之后履行?e) {
System.out.println("catch block");
}
finally {
System.out.println("finally block");
if (b > 25) {
System.out.println("b>25, b = " + b);
}
}
return b;
}
}

运转成果是:

try block
finally block
b>25, b = 100
100

阐明return句子现已履行了再去履行finally句子,不过并没有直接回来,而是等finally句子履行完了再回来成果。

假如觉得这个比如还不足以阐明这个状况的话,下面再加个比如加强证明定论:

public class FinallyTest1 {
public static void main(String[] args) {
System.out.println(test11());
}
public static String test11() {
try {
System.out.println("try block");
return test12();
} finally {
System.out.println("finally block");
}
}
public static String test12() {
System.out.println("return statement");
return "after return";
}
}

运转成果为:

try block
return statement
finally block
after return

阐明try中的return句子先履行了但并没有当即回来,比及finally履行完毕后再

这儿我们或许会想:假如finally里也有return句子,那么是不是就直接回来了,try中的return就不能回来了?看下面。

2. finally块中的return句子会掩盖try块中的return回来。

public class FinallyTest2 {
public static void main(String[] args) {
System.out.println(test2());
}
public static int test2() {
int b = 20;
try {
System.out.println("try block");
return b += 80;
} catch (Exception e) {
System.out.println("catch block");
} finally {
System.out.println("finally block");
if (b > 25) {
System.out.println("b>25, b = " +司马宏 b);
}
return 200;
}
// return b;
}
}

运转成果是:

try block
finally block
b>25, b = 100
200

这阐明finally里的return直接回来了,就不论try中是否还有回来句子,这儿还有个小细节需求留意,finally里加上return往后,finally外面的return b就变成不行抵达句子了,也便是永久不能被履行到,所以需求注释掉不然编译器报错。

这儿我们或许又想:假如finally里没有return句子,但修正了b的值,那么try中return回来的是修正后的值仍是原值?看下面。

3. 假如finally句子中没有return句子掩盖回来值,那么本来的回来值或许由于finally里的修正而改动也或许不变。

测试用例1:

public class FinallyTest3 {
public static void main(String[] args) {
System.out.println(test3());
}
public static int test3() {
int b = 20;
try {
System.out.println("try block");
return b += 80;
} catch (Exception e) {
System.out.println("catch block");
} finally {
System.out.println("finally block");
if (b > 25) {
System.out.println("b>25, b = " + b);
}
b = 150;
}
return 2000;
}
}

运转成果是:

try block
finally block
b>25, b = 100
100

测试用例2:

import java.util.*;
public class FinallyTest6
{
public static void main(String[] args) {
System.out.println(getMap().get("KEY").toString());
}
public static Map getMap() {
Map map = new HashMap();
map.put("KEY", "INIT");
try {
map.put("KEY", "TRY");
return map;
}
catch (Exception e) {
map.put("KEY", "CATCH");
}
finally {
map.put("KEY", "FINALLY");
map = null;
}
return map;
}
}

运转成果是:

FINALLY

为什么测试用例1中finally里的b = 150;并没有起到效果而测试用例2中finally的map.put("KEY", "FINALLY");起了效果而map = null;却没起效果呢?

这便是Java到底是传值仍是传址的问题了,简略来说便是:Java中只要传值没有传址,这也是为什么map = null这句不起效果。这一起也阐明晰回来句子是try中的return句子而不是 finally外面的return b;这句,不相信的话能够试下,将return b;改为return 294,对本来的成果没有一点影响。

这儿我们或许又要想:是不是每次回来的必定是try中的return句子呢?那么finally外的return b不是一点效果没吗?请看下面。

4. try块里的return句子在反常的状况下不会被履行,这样详细回来哪个看状况。

public class FinallyTest4 {
public static void main(String[] args) {
System.out.println(test4());
}
public static int test4() {
int b = 20;
try {
System.out.println("try block");
b = b / 0;
return b += 80;
} catch (Exception e) {
b += 15;
System.out.println("catch block");
} finally {
System.out.println("finally block");
if (b > 25) {
System.out.println("b>25, b = " + b);
}
b += 50;
}
return 204;
}
}

运转成果是:

try block
catch block
finally block
b>25, b = 35
85

这儿因 为在return之前发作了除0反常,所以try中的return不会被履行到,而是接着履行捕获反常的catch 句子和终究的finally句子,此刻两者对b的修正都影响了终究的回来值,这时return b;就起到效果了。当然假如你这儿将return b改为return 300什么的,最终回来的便是300,这毋庸置疑。

这儿我们或许又有疑问:假如catch中有return句子呢?当然只要在反常的状况下才有或许会履行,那么是在finally之前就回来吗?看下面。

5. 当发作反常后,catch中的return履行状况与未发作反常时try中return的履行状况彻底相同。

public class FinallyTest5 {
public static void main(String[] args) {
System.out.println(test5());
}
public static int test5() {
int b = 20;
try {
System.out.println("try block");
b = b /0;
return b += 80;
} catch (Exception e) {
System.out.println("catch block");
return b += 15;
} finally {
System.out.println("finally block");
if (b > 25) {
System.out.println("b>25, b = " + b);
}
b += 50;
}
//return b;
}
}

运转成果如下:

try block
catch block
finally block
b>25, b = 35
35

阐明晰发作反常后,catch中的return句子先履行,确认了回来值后再去履行finally块,履行完了catch再回来,finally里对b的改动对回来值无影响,原因同前面相同,也便是说状况与try中的return句子履行彻底相同。

最终总结

finally块的句子在try或catch中的return句子履行之后回来之前履行且finally里的修正句子或许影响也或许不影响try或catch中 return现已确认的回来值,若finally里也有return句子则掩盖try或catch中的return句子直接回来。



上一条      下一条
返回顶部