黑马程序员技术交流社区
标题:
求结果,请作详细说明
[打印本页]
作者:
wangzhiyong515
时间:
2014-5-12 15:05
标题:
求结果,请作详细说明
public static void main(String[] args) {
System.out.println(getInt());
}
private static int getInt() {
int x = 10;
try {
x = 20;
System.out.println(x / 0);
x = 30;
} catch (ArithmeticException e) {
x = 40;
return x; } finally {
x = 50;
}
return x;
}
作者:
skill20
时间:
2014-5-12 15:11
是40吗?
作者:
247033993@qq.co
时间:
2014-5-12 17:20
这涉及到try...catch语句的执行顺序问题了
try{
//1:抛出异常的代码
//2:代码
}catch(){
//3:代码
//4:抛出异常
}finally{
//5:代码
}
//6:代码
首先finally语句,是不管try是否抛出异常,finally语句块都会执行
其次,这个语句执行顺序会有几种情况:
第一种大的情况:try语句块没有抛出异常,则程序会执行try,finally以及finally块之后的代码;
第二种大的情况:try语句块抛出了异常并且catch有匹配的异常。当遇到try里面抛出的异常后,try块里面剩下的代码就不执行了,跳转到catch块里面。
这里又可以分为2种情况。第一种,抛出的异常被后面的catch捕获,而catch又没有抛出新的异常,那么执行顺序是1,3,5,6 ;第二种,如果catch里面又抛出新的异常,顺序是1,3,4,5,然后将新的异常返回给方法调用者,6就不执行了 ;
第三种打的情况:try语句块抛出了异常,但是后面的catch没有能匹配的异常。那么会执行try和finally里面的语句也就是1,5,然后将该异常返回给方法调用者,不执行6 。
这就是一些try...catch语句的一些情况。再来分析楼主的代码。
System.out.println(x / 0);
复制代码
这一句将会产生异常,所以后面的x=30就不会被执行了。
这个异常被catch捕获,并重新赋值x=40,这就相当于捕获异常并且抛出了一个异常,并且返回,所以finally代码块之后的语句不会被执行,这
接下来将执行finally代码块,虽然重新赋值了,但并没有返回x的值。
所以结果应该是40.
不知道这么说楼主明白吗?
作者:
optimisticpig
时间:
2014-5-12 17:39
第一:return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回)
第二:finally里面不建议放return语句,根据需要,return语句可以放在try和catch里面和函数的最后。可行的做法有四:
1.return语句只在函数最后出现一次。
2.return语句仅在try和catch里面都出现。
3.return语句仅在try和函数的最后都出现。
4.return语句仅在catch和函数的最后都出现。
注意,除此之外的其他做法都是不可行的,编译器会报错。
(1)如果程序运行到try成功时可以返回结果,则采用方法2。
(2)如果程序运行到catch时(即中途出错时)无需再继续执行后面的代码了,则采取方法4;
(3)如果程序运行到try或catch时还需要继续执行后面的代码,则采取方法1
作者:
大恶魔先森~
时间:
2014-5-12 17:45
本帖最后由 大恶魔先森~ 于 2014-5-12 17:52 编辑
结果为40.
public static void main(String[] args)
{
System.out.println(getInt());
}
private static int getInt()
{
int x = 10;//位置1
try
{
x = 20;//位置2
System.out.println(x / 0);//位置3
x = 30;// 位置4
}
catch (ArithmeticException e)
{
x = 40;//位置5
return x; //位置6
}
finally
{
s=50;//位置7
}
}
复制代码
1,首先初始化执行位置1,将10赋值给x,x==10;
2,然后执行try中位置2,x==20;接着执行输出语句,遇到异常,直接跳过位置4.
3,跳过位置4执行cath语句,在一次改变了x的值,x==40,并用return语句将结果返回给了主函数,但是程序还没运行完,但是结果已经知道x==40;
4,执行finally位置7中的语句,但是结果已经返给了主函数。所以赋值无效,程序停止。无论如何,finally语句是一定会执行。还有一点件事要记住:在try,catch,finally中含有return的执行情况:1.无论try里面有没有return语句,finally语句一定都会执好。
2.如果finally中没有return语句,try里面有return,那么在执行try中的return语句之前会先去执行finally中的代码,再去执行try中的return语句;如果在finally中也包含return语句,将会直接返回,不再去执行try中的return语句。
作者:
Jero
时间:
2014-5-12 20:28
:lol细心点就好了。
作者:
倪大大
时间:
2014-5-12 21:23
结果是40,当你执行除0操作后,代码会发生异常,你进行了catch 所以程序会跳转到 catch语句中,x=30就不会执行,
在catch 中 x=40 被赋值后,执行了return语句,这时候外部调用此函数的对象就会获得return 回来的x值
也就是40
至于x=50 虽然有这个赋值动作,但只是内部操作了,和调用此函数的对象无关
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2