黑马程序员技术交流社区
标题:
关于try的一道题
[打印本页]
作者:
人在旅途~东营
时间:
2015-5-24 01:49
标题:
关于try的一道题
题目一:try{}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,
* 什么时候被执行,在return前还是后?使用程序验证。
*
* 答:会,在return语句执行的中间运行的finally语句
* 在try语句中,在执行return语句的时候,要返回的结果其实已经准备好了,
* 这时候try中返回的结果先储存到一个局部变量中,执行完finally后,从中取出返回结果.
* 1: return i; //20 这个时候 只是进行了返回的标记,同时,确定要返回的数据值,没有真正的执行返回语句
* 2: 执行了 finally语句
* 3: 再回到return i; 返回当时的i值,也就是20
* 程序运行结果:
* 产生了异常
* 执行finally语句
* 结果是:20
* 程序结束了
* */
public class Try_Test {
public static void main(String[] args) {
System.out.println("结果是:"+new Try_Test().method(20));
//System.out.println(result);
System.out.println("程序结束了");
}
private static int method(int i) {//i = 20
// TODO Auto-generated method stub
try {
System.out.println(i/0);
} catch (Exception e) {
// TODO: handle exception
System.out.println("产生了异常");
return i;//20
}
finally {
System.out.println("执行finally语句");
i++;//21
}
return 0;
}
}
作者:
人在旅途~东营
时间:
2015-5-25 16:25
竟然没有人看,是我太水了么~
作者:
wangaz
时间:
2015-5-25 17:53
我来了,哈哈,这样做就可以了:
package com.ceshi;
/**
* 第一题:try{}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?使用程序验证。
*
* try{}里有一个return语句,那么紧跟在这个try后的finally {}里的code会 被执行到,在return后被执行到,验证程序如下:
* @author Administrator
*
*/
public class TryFinally {
public static void main(String[] args) {
System.out.println(show());
}
/*
* 定义show()函数,用i来标记返回的值,如果finally语句块先于return执行,那么主函数当中最后打印输出的值应该是1;否则,主函数当中打印输出的值应该是0
*/
public static int show()
{
int i = 0;//用i来进行标识
try{
System.out.println("try running+++"+i);
return i;
}
finally{
i++;
System.out.println("finally running+++"+i);
}
}
}
复制代码
上面已解释清楚,不再废话了。
作者:
LoveMyself
时间:
2015-5-25 18:19
//分析:在方法中定义整型变量num赋值为1;根据Java虚拟机的缓存机制来解决之个问题
// 如果先执行return:那么结果是这样的:[(1+1+1)+ 1] +{[(1+1+1)+ 1]+1} = 9
// 如果先执行finally:那么结果是这样的: {(1+1)+ [(1+1)+1]} + {(1+1)+ [(1+1)+1]+1} =11
// 如果输出的结果为3,则是先执行return
/**
* 由于以下代码执行的结果是9,所以先执行的是return
*/
class Test {
public int method() {
// 声明整型数据num
int num = 1;
try {
num = num++ + num++;
return num;
} finally {
num = ++num + ++num;
System.out.println("num=" + num);
}
}
}
public class Test8 {
public static void main(String[] args) {
// 声明Test对象,调用方法
Test test = new Test();
test.method();
}
}
复制代码
我是这么实现的
作者:
cunbai
时间:
2015-5-25 19:10
学习了!
作者:
白水丶
时间:
2015-5-25 23:13
赞一个~~
作者:
柒仴、看雲佉
时间:
2015-5-25 23:33
赞一个~~~
作者:
人在旅途~东营
时间:
2015-5-25 23:38
wangaz 发表于 2015-5-25 17:53
我来了,哈哈,这样做就可以了:上面已解释清楚,不再废话了。
我的程序没问题吧?只是发帖格式的问题的话那我就放心了
作者:
白昼那知夜的黑
时间:
2015-5-26 00:09
人在旅途~东营 发表于 2015-5-25 16:25
竟然没有人看,是我太水了么~
会执行,
public class Test {
public static void main(String[] args) {
/**
* 会执行,在return前执行;
* 分析:finally是不管遇到任何事都必须执行的语句块,如果在try中直接return了,
* 那么finally就执行不了,
* 就违背了这条规则,所以是先执行finally中的code再return
*/
testOne();
}
public static String testOne() {
try {
System.out.println("执行到try语句块中!");
return "";
} catch (Exception e) {
// TODO: handle exception
} finally {
System.out.println("finally中的code执行了!");
}
return "";
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2