试题以下:程序员
try {}里有一个return 语句,那么紧跟在这个try 后的ide
finally {}里的code 会不会被执行,何时被执行,在return函数
前仍是后?测试
……code
……ip
但愿不要早早看下面的解释,本身想一下get
……源码
……it
也许你的答案是在return 以前,但往更细地说,是在return 中间执行io
看源码:
package dec;
/**
*
*
* <p>
* Title: try_catch_finally测试代码 /p>
*
* <p>
* Description: 示例 业务类
* </p>
*
* <p>
* Copyright: Copyright (c) 2012
* </p>
*
*
* @author dml@2012-12-4
* @version 1.0
*/
public class TestTryCatchFinaly {
public static void main(String[] args) {
System.out.println("test1返回结果:" + new TestTryCatchFinaly()。test1());
}
int test1() {
int x = 1;
try {
System.out.println("try打印:" + x);
return x;
//这句编译不经过
// System.out.println("try打印:" + x);
} finally {
++x;
System.out.println("finally打印:" + x);
}
}
}
以上程序运行结果:
try打印:1
finally打印:2
test1返回结果:1//运行结果是1,为何呢?主函数调用子函数并获得结果的过程,比如主函数准备一个空罐子,当子函数要返回结果时,先把结果放在罐子里,而后再将程序逻辑返回到主函数。所谓返回,就是子函数说,我不运行了,你主函数继续运行吧,这没什么结果可言,结果是在说这话以前放进罐子里的。
明白了吧,先执行try中语句,而后遇到return时,将结果返回,接着执行finally中语句,后执行主函数语句。
接下来,看看这个函数:
public int test2() {
try {
return 1;
} finally {
return 2;
}
}
主函数中:
System.out.println("test2返回结果:" + new TestTryCatchFinaly()。test2());
应该打印结果是?
……
……
好好想一想
……
……
执行结果是:
test2返回结果:2
是否是有点晕了?不怕…
看看解释怎么说的:
try 中的return 语句调用的函数先于finally 中调用的函数执行,也就是说return 语句先执行,
finally 语句后执行,因此,返回的结果是2.Return 并非让函数立刻返回,而是return 语
句执行后,将把返回结果放置进函数栈中,此时函数并非立刻返回,它要执行finally 语
句后才真正开始返回。
这会儿应该懂了吧,测试一下:
int test3() {
try {
return func1();
}
finally {
return func2();
}
}
int func1() {
System.out.println("func1被执行");
return 1;
}
int func2() {
System.out.println("func2被执行");
return 2;
}
主函数中:
System.out.println("test3返回结果:"+new TestTryCatchFinaly()。test3());
执行结果是?
……
……
func1被执行
func2被执行
test3返回结果:2
要是还不明白,看看上面的一句话
明白了吧,先执行try中语句,而后遇到return时,将结果返回,接着执行finally中语句,后执行主函数语句。
好好理解下
……
……
针对后面两个示例,能够这么总结:
明白了吧,先执行try中语句,而后遇到return时,将结果返回,接着执行finally中语句,遇到return,将结果返回(也就是最后打印的结果),最后执行主函数语句。
p.s.程序的好处是不管何时都是肯定的,不肯定的只有程序员是否真的掌握了,不要把技术看的太难,也不能把技术看的太简单,作对的事情要比把事情最对更重要。