黑马程序员技术交流社区
标题:
try中的return语句与finally语句执行先后的问题
[打印本页]
作者:
崔湖尧
时间:
2014-6-20 11:20
标题:
try中的return语句与finally语句执行先后的问题
本帖最后由 崔湖尧 于 2014-6-21 12:58 编辑
在try中写了return,后面又写了finally,是先执行return还是先执行 * fianlly?
代码测试如下:
class TestDemo {
public static void main(String[] args) {
orderTest();
}
public static int orderTest() {
try {
return systemOutput("Return");
} finally {
systemOutput("Finally");
}
}
private static int systemOutput(Object obj) {
System.out.println(obj);
return 0;
}
}
复制代码
运行结果为:
Retrun
Finally
很显然,return语句先执行。
我们已经知道return语句先执行,那么fianlly中的语句是否会改变return语句中的变量的值呢?
代码如下:
class TestDemo {
public static void main(String[] args) {
System.out.println(isFinallyStatementsExecuteFirst());
}
private static boolean isFinallyStatementsExecuteFirst() {
boolean finallyStatementsExecute = false;
try {
return finallyStatementsExecute;
}finally {
finallyStatementsExecute = true;
}
}
}
复制代码
运行结果为false,就是fianlly中的主句不能改变return中变量的值。
问题又来了,如果在finally语句中也加入return语句,结果会怎样呢?
在finally语句中加入:return ture语句。
结果为true。也就是说,finally中的return语句覆盖了try中的return。
我想知道这些操作在内存中是怎样进行的?栈中,堆中?
作者:
人心如水
时间:
2014-6-20 12:25
同求,,,,
作者:
姿_`态
时间:
2014-6-20 12:49
class TestDemo {
public static void main(String[] args) {
System.out.println(isFinallyStatementsExecuteFirst());
}
private static boolean isFinallyStatementsExecuteFirst() {
boolean finallyStatementsExecute = false;
try {
return finallyStatementsExecute;
}finally {
finallyStatementsExecute = true;
return finallyStatementsExecute;//结果肯定是true
}
}
}
首先要明确的是 ,你的方法是静态的 ,那么肯定是在方法区,其实关于返回值问题,没那么复杂,你的
isFinallyStatementsExecuteFirst方法 返回值是boolean类型的,所以看程序内部的return语句,如果return语句在try内,那么返回就是那个return语句内容,
如果try和finally内都有return语句,那么就看fianlly内的return语句,总之就看最后一个return语句。
作者:
rover0321
时间:
2014-6-20 21:47
我更奇怪的是为什么执行了return语句还能执行finally代码块中的语句。这点,我感觉跟C++很不一样。
作者:
iWilliam
时间:
2014-6-20 21:59
介个,毫无疑问,必须先执行finally,最后执行return,因为一旦return,程序(或者方法)便终止了
你的这个列子很有迷惑性,关键就在于这句
return System.out.println("Return");
由于println没有返回值,事实上它等价于:
System.out.println("Return");
return;
假如是这样的:
return a+b;
就很好理解了,
先算了a+b(假如为c)
然后执行了finally代码块
最后把c返回。
作者:
千曲生
时间:
2014-6-20 23:22
首先明确一点:一般情况下都是先执行finally语句中的语句,最后执行return语句,finally在return之前执行,除非没有return语句被执行:像:
public int method()
{
int a=9;
try{
int b=a/0;
}catch(Exception e)
{}
finally
{
System.out.println("没有输出return");
exit();
return a;
}
}
复制代码
类型的,但这只是特殊情况,一般都是finally在return之前执行
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2