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()捕不到其异常。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值