今天被问到java是如何处理异常的?
啊,try/catch呀
那你知道finally的代码在捕获异常后还执行麽?未捕获时候呢?
啊,这个简单,都执行的,因为finally语句块内的语句无论在什么时候,什么情况下都会被执行,所以经常会写一些释放资源的语句
那既然都会执行,为什么还要写呢?
额。。。这不正因为一定会执行,所以可以写一些必须要执行的动作,譬如释放资源什么的麽
那finally的执行时机是什么时候呢?return前or后?
。。。
。。。。。。
。。。。。。。。。不造啊~(>_<)~。。。
哦,可能没仔细考虑过是不是?
~~~~(>_<)~
。。。嗯,没深入想过。。。
当时太羞愧了,回来赶紧看一下。。。
Google到的很多答案,看的一头雾水,就写了几个测试用例,得出一些结论,通过书本的理论知识可以学的很全面,很权威,但当自己去实践着摸索的学习,测试用例肯定设计的不全面,所以我的结论真心不太靠谱啊。。。(那你为什么不设计全面些呢?~~~~(>_<)~学艺不精想不全所有可能的情况啊)
话说回来,如果能够通过全覆盖的测试用例而得出结论,那不止准确,简直是发明,哦不,发现知识呀~
public class Test1 {
public static void main(String[] args) {
System.out.println(test1());
}
public static int test1() {
int b = 10;
try {
System.out.println("try");
return b += 80;
}
catch (Exception e) {
System.out.println("catch");
}
finally {
System.out.println("finally");
if (b > 35) {
System.out.println("b>35, b = " + b);
}
}
return b;
}
}
这个程序没有出现异常,所以顺序执行,try内的语句都执行了;跳过捕获catch而到达了finally,程序运行结果是:
b>35, b = 90
90
说明return语句已经执行了(b值不是10而是执行了b += 80的90),再去执行finally语句,不过执行完return语句并没有直接返回,而是等finally语句执行完了再返回结果,所以finally语句是在return语句执行之后,但尚未返回之前执行的
在此结论之上,想想看,try的return动作了一半就好心好意踏踏实实的等你finally执行完它再返回的,如果finally也有个return语句,那么是不是就直接返回了,try中的return还能不能返回了?
答案是。。。不能。。。
public class Test2 {
public static void main(String[] args) {
System.out.println(test2());
}
public static int test2() {
int b = 10;
try {
System.out.println("try");
return b += 80;
} catch (Exception e) {
System.out.println("catch");
} finally {
System.out.println("finally");
if (b > 35) {
System.out.println("b>35, b = " + b);
}
return 300;
}
// return b;
}
}
这个的执行结果:
b>35, b = 90
300
在finally的输出语句System.out.println(“b>35, b = ” + b)下,b=90,而不是在执行try的return b += 80;之前的int b = 10;
再然后因为自己有个return 300;它就给返回了,程序也出来了,try的return b += 80;确实执行了,于是它改变了b的值,但因为finally也有return,程序直接返回了,压根也不管try中是否还有个大明湖畔的夏雨荷,哦不,是“返回语句”o(╯□╰)o
测试用例么,要全面啊,单纯以测试的角度来说,除了try内有return,finally怎么执行,可能的情况还有catch内有return,finally怎么执行?
这很简单啊,未捕获异常,就跳过catch顺序执行try,结论如上,那当出现异常,则try内异常以下的代码就不会有机会执行,不论有没有return,都调进catch,而catch是异常的处理器,一定顺序执行,那么如果它有return,应该是一样的情况,一样的结论