黑马程序员技术交流社区
标题:
不太明白这东西
[打印本页]
作者:
黄杨
时间:
2013-2-6 17:46
标题:
不太明白这东西
public static int test() {
try {
System.out.println("");
return 1;
} catch (Exception e) {
e.printStackTrace();
return 2;
}finally{
return 3;
}
}
为什么这句话最后返回的只有一个3? 1和2跑哪去了?
作者:
朱玉玺
时间:
2013-2-6 18:03
1,虽然你使用了处理异常的语句,但个方法其实不会发生异常,也就是说,catch中的代码永远不会执行,所以就看不到return 2喽。
2.当读到return 1时,本来应该返回1,但你有finally,这导致return 1 执行前,它先判断有没有finally,有则先执行finally里的语句,然后再return 1;
3.因为你finally里中已经有return 3了,它执行完后,方法已经结束了,所以try中return 1就没有执行到。
作者:
李洪因
时间:
2013-2-6 19:08
在try语句中写入我们准备要尝试运行的代码,在运行中try语句只负责抛出运行代码时发生的异常。
在catch语句中我们写入的是对try语句运行中抛出异常的处理代码,catch语句需要传入异常类型作为参数,一旦catch捕获对应类型的异常就执行catch中的代码。在一个try语句后面可以跟多个catch语句,对try语句中抛出的异常进行针对性的处理。但是要注意try语句中产生的是异常还是错误。finally语句主要进行的是扫尾工作,无论try语句中是否抛出异常,都执行finally中的代码。例如在try语句中抛出了一个异常,被一个catch语句捕获,首先执行catch中的代码,执行完毕后转入finally语句中执行其中代码。
在该程序中有finally所以先执行,当执行玩finally程序就结束啦;
作者:
王国伟.
时间:
2013-2-7 20:31
本帖最后由 王国伟. 于 2013-2-7 20:42 编辑
一般来说 finally 块区域中的代码都是不能够通过重新赋值的方式来改变 try 区域和catch中 return 语句的返回值。但是有一种情况例外,那就是在 finally 内部使用 return 语句。
class test
{
public static void main(string[] args)
{
int a=test();
system.out.println(a); //输出的结果是3
}
public static int test()
{
try
{
string s=null;
s.substring(0,1);
return 1;
}
catch(exception e)
{
return 2;
}
finally //如果没有finally,则输出2
{
return 3;
}
}
}
finally 内部使用 return 语句后,它影响(覆盖了) try 区域和catch中 return 语句的返回值。
之所以出现这种现象的真正原因是,由于 finally 区域中的代码先于 return 语句被执行,但是,如果此时在 finally 内部也有一个 return 语句,这将会导致该函数直接就返回了,而致使 try 和catch作用域中的 return 语句再也得不到执行机会(实际就是无效代码,被覆盖了)。
强烈建议不要在 finally 内部使用 return 语句。
作者:
祝文丞
时间:
2013-2-7 20:54
1.2都被return返回啦。。
作者:
冯佩
时间:
2013-2-7 23:21
return是一结束标记,当读到return时,方法就会结束,但是如果方法中有finally的话,程序会读完finally中的代码再返回来读return,但是上述代码中的finally中有return,故方法在读到finally的return就会结束,所以不会再返回去读先前的return,而catch代码块中的代码则是在接收到异常时才会执行。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2