今天回顾了下异常,顿时发现平常开发时有这么一点小细节需要说明一下,如果稍微不注意就会存在一个很难验证的故障。有经验的老程序员估计会不在意吧~
在try catch finally 时永远都都只会执行finally块。
那么看看下面这个事例
public int TestFinally(){
try{
//这是实际业务
return 1;
}catch(Exception e){
return 2;
}finally{
return 3;
}
}
最终这段程序会永远返回3,不好奇为什么吗?是因为无论程序正常还是不正常运行最终都会从finally中返回。
如果try语句遇到异常了,try下面代码就根本不会被执行到,转而执行到catch里面,catch里面执行完异常处理会再执行finally语句块,最终会结束掉
如果在try语句块中执行到return语句前一条,未遇到异常,转而执行finally语句块,执行完再执行try中的return语句
那么return 不能在finally语句执行那么其他返回函数如break、continue是否可以呢?或者在finally在抛出异常呢?throw呢?
来尝试下吧
public int TestFinally1(){
try{
//这是实际业务
return 1;
}catch(Exception e){
return 2;
}finally{
break;
}
}
break,这个显然不行,失败。那么continue呢?
public int TestFinally2(){
try{
//这是实际业务
return 1;
}catch(Exception e){
return 2;
}finally{
continue;
}
}
hoho 当然也不行,失败。最后一个throw
public int TestFinally2() throws Exception{
try{
//这是实际业务
return 1;
}catch(Exception e){
return 2;
}finally{
throw new Exception();
}
}会是什么结果呢?
结果就是这个方法出现异常,没有任何返回值。。。
有不相信的同学可以试试。。
那么正确的方法如下,finally不做任何返回和异常抛出操作。
public int TestFinally() {
try{
//这是实际业务
return 1;
}catch(Exception e){
return 2;
}finally{
//不做任何返回和异常抛出操作
}
}
谢谢各位