论坛首页 入门技术论坛

finally里的return与java异常抛出的问题

浏览 2686 次
该帖已经被评为新手帖
作者 正文
   发表时间:2008-02-23  
一个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()捕不到其异常。
   发表时间:2008-02-24  
这是语法规则,不是缺陷
0 请登录后投票
   发表时间:2008-02-24  
infile()函数的异常在只在infile()函数捕抓,而抛出的异常throw new FileNotFoundException("infile(): file not found"),被忽视了。
===========================
造成你的看法错误的原因是:
1。throw
2。return
有这两个你就得到远行的结果,而不是缺陷。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics