黑马程序员技术交流社区
标题:
java异常问题
[打印本页]
作者:
邱成
时间:
2012-9-12 23:47
标题:
java异常问题
本帖最后由 邱成 于 2012-9-13 07:26 编辑
class Exceptions{
public String getMsg(){
String msg = "ok";
try {
return msg;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
msg="finally";
System.out.println("进到finally语句块:"+msg);
}
return msg;
}
public static void main(String[] args) {
System.out.println(new Exceptions().getMsg());
}
}
按道理说以上程序会先执行finally语句块,再return try语句块,而执行finally语句块后此时变量msg的值会变成finally,而我们return过后自然应该是打印的
进到finally语句块finally
finally
但是结果却是
进到finally语句块finally
ok
请问这是为什么?
作者:
信义明
时间:
2012-9-13 00:20
class Exceptions{
public String getMsg(){
String msg = "ok";
try {
return msg;
} catch (Exception e) {
e.printStackTrace();
}finally{
msg="finally";
System.out.println("进到finally语句块:"+msg);
}
return msg; //这里的msg没有执行
}
public static void main(String[] args) {
System.out.println(new Exceptions().getMsg());
}
}
/*
程序到try语句块时,这里的msg="ok",读到return msg时,如果有finally,
会进入finally执行,此时msg="finally",打印输出语句:进到finally语句块:finally
之后程序返回,返回的msg到主函数打印输出:ok
*/
复制代码
作者:
王金科
时间:
2012-9-13 00:28
正是楼上兄弟说的那样的一个流程
作者:
黑马张旭明
时间:
2012-9-13 00:50
按道理说以上程序会先执行finally语句块,再return try语句块
楼主错在这句话,实际上是先执行了try中的return语句再到finally中执行的,这里比较特殊的是return在退出函数之前其他部分不读,但是必须读finally{}。
所以是try中的return返回了"ok",然后finally中的msg="finally".
我改写了下楼主的代码
class Exceptions{
public String getMsg(){
String msg = "ok";
try {
return msg;
//这里返回了msg是"ok"
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
msg="finally";
System.out.println("进到finally语句块:"+msg);
return msg;
//这里返回的msg是"finally"
}
//return msg;
}
public static void main(String[] args) {
System.out.println(new Exceptions().getMsg());
}
}
结果是
进到finally语句块:finally
finally
作者:
吴通
时间:
2012-9-13 05:33
楼主:
当运行时,会先执行主函数,主函数有一个new Exceptions().getMsg(),说明调用Exceptions中的getMsg方法,
所以到Exceptions中执行getMsg,
先从try开始执行,并不是先执行finally
,finally语句是一定要执行的,但不一
定会最先执行,执行try语句有return语句说明返回数值,返回值类型为String,返回值为msg,这时msg为"ok",
主函数调用的是这个函数,而这个函数返回msg="ok",所以主函数打印"ok"
try语句中并没有抛出异常,所以catch语句不执行
执行finally语句,这时msg被重新赋值为"finally",所以打印语句打印的是"进到finally语句块:finally"
最后的return并不执行,因为前面已经return过了
下面这种情况在try中抛出异常,它的return执行不到,会执行最下面的return,结果就是你写的
进到finally语句块finally
finally
class Exceptions
{
public String getMsg()
{
String msg = "ok";
try
{
if(msg=="ok")
throw new Exception();
return msg;
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
msg="finally";
System.out.println("进到finally语句块:"+msg);
}
return msg;
}
public static void main(String[] args)
{
System.out.println(new Exceptions().getMsg());
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2