finally里的return与java异常抛出的问题
2008-02-23 23:52
232 查看
一个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()捕不到其异常。 阅读更多
相关文章推荐
- Java异常处理中同时有finally和return语句的执行问题
- java中try cathc finally return 相关异常问题
- 一个问题:关于finally中return吞掉catch块中抛出的异常
- 经典的java中return和finally问题!
- java return finally 问题
- 通过指令码来判断Java代码的执行顺序(++问题与return和finally的问题)
- Java异常处理机制以及try-catch-finally-return执行顺序
- Java异常处理中finally中的return会覆盖catch语句中的return语句
- Java中关于子类覆盖父类的抛出异常问题
- Java异常处理中,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
- finally中使用return会吃掉catch中抛出的异常
- 关于Java中try catch finally throw return的执行顺序问题
- Java异常处理机制以及try-catch-finally-return执行顺序
- Android:java 抛出异常throw与throws以及捕捉异常try、catch、finally学习
- java中两个double类型相加抛出异常报错问题的解决方法
- JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗
- 关于JAVA的try catch finally的return返回值问题
- java中异常处理finally和return语句的执行顺序
- Java异常捕获之try-catch-finally-return的执行顺序.md
- Java面试里关于try,catch,finally,return容易犯错的一个问题