浏览 2686 次
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-02-23
我在做一个项目时,该项目遇到了一个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()捕不到其异常。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-02-24
这是语法规则,不是缺陷
|
|
返回顶楼 | |
发表时间:2008-02-24
infile()函数的异常在只在infile()函数捕抓,而抛出的异常throw new FileNotFoundException("infile(): file not found"),被忽视了。
=========================== 造成你的看法错误的原因是: 1。throw 2。return 有这两个你就得到远行的结果,而不是缺陷。 |
|
返回顶楼 | |