2008-02-23
finally里的return与java异常抛出的问题
一个finally里的return与java异常抛出的问题
我在做一个项目时,该项目遇到了一个debug,经过的纠错之后才发现了一个finally里的return与java异常抛出的问题。
对于这个问题,笔者举以下简单的程序为例进行描述:
public static void main(String []args){
System.out.println(file());
}
public static boolean file(){
try{
for(int i=0;i<3;i++){infile();}
}
catch(FileNotFoundException e){System.out.println("file(): 捕抓到了异常");return false;}
finally{System.out.println("finally");}
return true;
}
public static int infile()throws FileNotFoundException{
try{
System.out.println("调用了infile()");
FileInputStream file = new FileInputStream("ee.ee");
}
catch(FileNotFoundException e){
System.out.println("infile(): 捕抓到了异常");
throw new FileNotFoundException("infile(): file not found");
}finally{return 1;}
}
运行结果是:
调用了infile()
infile(): 捕抓到了异常
调用了infile()
infile(): 捕抓到了异常
调用了infile()
infile(): 捕抓到了异常
finally
true
这样,infile()函数的异常在只在infile()函数捕抓,而抛出的异常throw new FileNotFoundException("infile(): file not found"),被忽视了。
然而,这是为什么呢?看以下代码:
public static void infile()throws FileNotFoundException{
try{
System.out.println("调用了infile()");
FileInputStream file = new FileInputStream("ee.ee");
}
catch(FileNotFoundException e){
System.out.println("infile(): 捕抓到了异常");
throw new FileNotFoundException("infile(): file not found");
}
}
以上代码只是把返回的数据类型改为void,并去掉finally{return 1;}。其他函数main(),file()不变,则运行结果为:
调用了infile()
infile(): 捕抓到了异常
file(): 捕抓到了异常
finally
false
接着,把在以上代码加上finally{return;}
运行结果还是为:
调用了infile()
infile(): 捕抓到了异常
调用了infile()
infile(): 捕抓到了异常
调用了infile()
infile(): 捕抓到了异常
finally
true
然后,把加上的finally{return;}去掉
再函数末加上System.out.println("8888888888");return;
运行结果为:
调用了infile()
infile(): 捕抓到了异常
file(): 捕抓到了异常
finally
false
笔者经过了多次试验,证明了就是finally{return;}在作怪。在infile()函数里,先执行了throw new FileNotFoundException("");抛出了异常,然后再执行finally{return;}语句(按理说执行了throw new FileNotFoundException("");抛出了异常,一般就不应该执行别的语句,也不会再执行紧跟其后的在同一个语句快的语句,然而finally{return;}却是被强制执行的),从而遮掩了异常,使函数file()捕不到其异常。
我在做一个项目时,该项目遇到了一个debug,经过的纠错之后才发现了一个finally里的return与java异常抛出的问题。
对于这个问题,笔者举以下简单的程序为例进行描述:
public static void main(String []args){
System.out.println(file());
}
public static boolean file(){
try{
for(int i=0;i<3;i++){infile();}
}
catch(FileNotFoundException e){System.out.println("file(): 捕抓到了异常");return false;}
finally{System.out.println("finally");}
return true;
}
public static int infile()throws FileNotFoundException{
try{
System.out.println("调用了infile()");
FileInputStream file = new FileInputStream("ee.ee");
}
catch(FileNotFoundException e){
System.out.println("infile(): 捕抓到了异常");
throw new FileNotFoundException("infile(): file not found");
}finally{return 1;}
}
运行结果是:
调用了infile()
infile(): 捕抓到了异常
调用了infile()
infile(): 捕抓到了异常
调用了infile()
infile(): 捕抓到了异常
finally
true
这样,infile()函数的异常在只在infile()函数捕抓,而抛出的异常throw new FileNotFoundException("infile(): file not found"),被忽视了。
然而,这是为什么呢?看以下代码:
public static void infile()throws FileNotFoundException{
try{
System.out.println("调用了infile()");
FileInputStream file = new FileInputStream("ee.ee");
}
catch(FileNotFoundException e){
System.out.println("infile(): 捕抓到了异常");
throw new FileNotFoundException("infile(): file not found");
}
}
以上代码只是把返回的数据类型改为void,并去掉finally{return 1;}。其他函数main(),file()不变,则运行结果为:
调用了infile()
infile(): 捕抓到了异常
file(): 捕抓到了异常
finally
false
接着,把在以上代码加上finally{return;}
运行结果还是为:
调用了infile()
infile(): 捕抓到了异常
调用了infile()
infile(): 捕抓到了异常
调用了infile()
infile(): 捕抓到了异常
finally
true
然后,把加上的finally{return;}去掉
再函数末加上System.out.println("8888888888");return;
运行结果为:
调用了infile()
infile(): 捕抓到了异常
file(): 捕抓到了异常
finally
false
笔者经过了多次试验,证明了就是finally{return;}在作怪。在infile()函数里,先执行了throw new FileNotFoundException("");抛出了异常,然后再执行finally{return;}语句(按理说执行了throw new FileNotFoundException("");抛出了异常,一般就不应该执行别的语句,也不会再执行紧跟其后的在同一个语句快的语句,然而finally{return;}却是被强制执行的),从而遮掩了异常,使函数file()捕不到其异常。
评论
gaoran2008
2008-02-24
infile()函数的异常在只在infile()函数捕抓,而抛出的异常throw new FileNotFoundException("infile(): file not found"),被忽视了。
===========================
造成你的看法错误的原因是:
1。throw
2。return
有这两个你就得到远行的结果,而不是缺陷。
===========================
造成你的看法错误的原因是:
1。throw
2。return
有这两个你就得到远行的结果,而不是缺陷。
jsyx
2008-02-24
这是语法规则,不是缺陷
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 2420 次
- 性别:

- 来自: 深圳

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
POI读取EXCEL文件的错误 ...
用程序做转换,暂时还不知道
-- by linbzh -
POI读取EXCEL文件的错误 ...
那么该怎么用程序来实现这个转换呢?我也碰到这样的问题...
-- by computerceo -
finally里的return与java ...
infile()函数的异常在只在infile()函数捕抓,而抛出的异常throw ...
-- by gaoran2008 -
struts的ActionForm的一个 ...
struts.do?type=all---你的URL都是这样的,也就是说你的ty ...
-- by gaoran2008 -
finally里的return与java ...
这是语法规则,不是缺陷
-- by jsyx






评论排行榜