黑马程序员技术交流社区
标题:
关于try。。。catch的问题
[打印本页]
作者:
吴在兴
时间:
2013-1-27 23:18
标题:
关于try。。。catch的问题
try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
作者:
刘军亭
时间:
2013-1-27 23:36
try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,会执行的,会在return执行前执行的。比如执行到return还没有执行return时候,程序会先执行finally然后再执行return
作者:
廖成
时间:
2013-1-27 23:40
1. 当有finally语句并且try中有return,在执行到return(还未执行)的时候,会先执行finally里面的内容,然后再执行行try中的return。
package com.and.java.demo;
public class 测试 {
public static void main(String[] args) {
System.out.println(new 测试().test());
}
public String test() {
try {
System.out.println("try{...}");
return "try";
} catch (Exception e) {
System.out.println("catch{...}");
return "catch";
} finally {
System.out.println("finally{...}");
}
}
}
复制代码
输出:
try
{...}
finally
{...}
try
2、在1的基础上,如果finally里面也有return语句,则try代码块中的return被屏蔽(不执行),即在try中遇到return的时候,会先执行finally里面的内容(包括finally里面的return语句)。
package com.and.java.demo;
public class 测试 {
public static void main(String[] args) {
System.out.println(new 测试().test());
}
public String test() {
try {
System.out.println("try{...}");
return "try";
} catch (Exception e) {
System.out.println("catch{...}");
return "catch";
} finally {
System.out.println("finally{...}");
return "finally";
}
}
}
复制代码
输出:
try
{...}
finally
{...}
finally
作者:
张敬培
时间:
2013-1-28 00:00
在try{}...catch(){}...finally{}中,finally里面的语句是永远都执行的,一般在try catch执行完后再执行finally里面的语句。
但如果在前面遇到跳转 例如:return 语句时,finally中的语句会在return执行前执行。
这样做的原因是:在执行try catch的代码的时候,可能导致系统异常结束,或者跳转到另一个对象上,这样就可能导致系统资源没有关闭。
finally总是执行和在return前执行就避免了这个问题的发生。
关于楼主的问题:当遇到前面的try中有return时,finally里面的语句是否会执行,答案是会执行,而且会在return语句的前面执行
作者:
黑马-小龙
时间:
2013-1-28 00:38
ublic class TryCatch {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
System.out.println(fun());
}
public static int fun() throws Exception {
int a = 1;
try {
return a++;
} finally {
++a;
}
}
}
复制代码
这是一个插入执行顺序,如果是顺序执行的话, 那么它的结果就会改变
可以将try中的值和finally的值看做2个不同类型的a,
try的代码中有return时,finally中的代码同样会执行,会在它之前执行。但是上面的列子,你可以看做它们在内存中操作的不是同一个变量
作者:
杨浩
时间:
2013-1-28 00:47
本帖最后由 杨浩 于 2013-1-28 00:54 编辑
class MyTest{
public static String func(){
try{
System.out.println("try里跳转前的语句");
return "try";
}catch(Exception e){
System.out.println("异常处理语句");
}finally{
System.out.println("finally语句");
}
return "over";
}
}
public class MyDemo{
public static void main(String[] args){
System.out.println(MyTest.func());
}
}
复制代码
输出结果是:
try里跳转前的语句
finally语句
try
finally里的语句是一定会执行的,除非它也发生异常无法执行,那就要继续try咯
而finally里的语句执行是在try里的跳转之前的,原因是保证异常处理完成前,不会出现意外。
一般我们会在finally里关闭系统资源,而如果finally执行在跳转后的话,那就可能导致资源无法正常关闭。
(跳转后面不会有语句的,因为执行不到嘛,嘿嘿,不过这个好像大家都知道的)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2