`
linbzh
  • 浏览: 71695 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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()捕不到其异常。
分享到:
评论
2 楼 gaoran2008 2008-02-24  
infile()函数的异常在只在infile()函数捕抓,而抛出的异常throw new FileNotFoundException("infile(): file not found"),被忽视了。
===========================
造成你的看法错误的原因是:
1。throw
2。return
有这两个你就得到远行的结果,而不是缺陷。
1 楼 jsyx 2008-02-24  
这是语法规则,不是缺陷

相关推荐

    java throw抛出异常实例一

    异常处理通过`try-catch-finally`块来实现,其中`try`块包含可能抛出异常的代码,`catch`块捕获并处理异常,`finally`块则包含无论是否发生异常都需要执行的代码。 在`throw`语句中,我们可以指定一个异常对象来抛...

    Java的throw和return

    - 如果`finally`块中有`return`语句,则会先执行`return`语句,再抛出异常。 - 如果`finally`块中有其他操作,但没有`return`语句,则直接抛出异常。 下面通过具体的代码示例来进一步解释: ```java public int ...

    try_catch_finally异常处理java

    当Java执行到可能抛出异常的代码行时,如果确实发生了异常,那么控制权就会立即转移到与之关联的`catch`块。 `catch`块是用来捕获和处理异常的地方。每个`catch`块都对应一个特定的异常类或者异常类的父类,这样就...

    Java finally语句到底是在return之前还是之后执行?

    1. 如果`try`块中的代码没有抛出异常,那么`finally`块会在`try`块结束时执行,之后控制权将传递给相应的`return`语句。 2. 如果`try`块中的代码抛出一个未捕获的异常,`finally`块仍然会执行,然后再将异常传递给...

    实验五 Java异常处理实验.docx

    在 Java 中,异常可以通过 throw 语句抛出,catch 语句可以捕获异常。抛出异常是指程序中出现错误时,抛出异常对象,以便于捕获和处理异常。捕获异常是指使用 catch 语句捕获抛出的异常对象,并进行相应的处理。 ...

    深入理解java异常处理机制

    1. **`testEx2`** 方法中的 `finally` 块被执行后,返回了一个布尔值 `false`,这导致了 `testEx1` 方法中的 `finally` 块也输出了 `false` 的返回值,而不是在 `catch` 块中抛出异常。 2. **`testEx1`** 方法中的 ...

    Java中finally和return的关系实例解析

    如果finally语句中包含了return语句,即使前面的catch块重新抛出了异常,则调用该方法的语句也不会获得catch块重新抛出的异常,而是会得到finally块的返回值,并且不会捕获异常。 在Java中,还有一个非常重要的知识...

    java异常处理

    #### 错误与异常的区别 错误通常指更为严重的问题,如内存溢出等,这些问题往往是不可预测且难以处理的,因此通常不通过异常处理机制解决。而异常则是一种可以在程序中被捕获和处理的事件,使得程序即便遇到问题也能...

    java异常处理,绝对值得你的关注

    当异常发生时,Java会抛出(throw)这个异常对象,然后程序可以选择捕获(catch)并处理这个异常,或者让异常继续传播。 Java异常处理主要包括五个关键字:try、catch、finally、throw和throws。它们共同构成了异常...

    JAVA抛出异常的实验.doc

    因此,在这个例子中,无论`try`块是否抛出异常,最终函数的返回值都将由`finally`块中的`return`决定,即函数`normal()`的返回值始终是`20`。 #### 实验二:程序运行结果分析 接下来,我们来看第二个实验案例: ```...

    JAVA 异常处理的学习

    二、异常的抛出与捕获 1. 抛出异常:当一个异常发生时,Java会创建一个异常对象并“抛出”它。这可以通过使用`throw`关键字来实现。例如,`throw new IllegalArgumentException("参数错误");` 2. 捕获异常:为了...

    高效java异常处理机制

    finally块中的代码不应抛出新的异常,因为它会覆盖原有的异常信息,使调试困难。 12. **使用 throws 关键字声明异常** 如果方法可能抛出检查型异常,应在方法签名中使用throws关键字声明,让调用者知道需要处理...

    java异常ppt

    Java通过一套结构化的异常处理机制来管理这些问题,主要包括五个关键字:try、catch、finally、throw和throws。 `try`块包含可能抛出异常的代码,如果在`try`块中发生异常,控制流会立即跳转到匹配的`catch`块。`...

    03-Java异常面试题.docx

    Java 异常处理的最佳实践包括在 finally 块中清理资源或者使用 try-with-resource 语句,优先明确的异常,对异常进行文档说明,使用描述性消息抛出异常,优先捕获最具体的异常,不要捕获 Throwable 类,不要忽略异常...

    java异常捕捉

    如果try块中的代码抛出了一个异常,控制权立即转移到与之匹配的`catch`块。`catch`块包含处理特定异常的代码,每个catch块可以捕获一种类型的异常。例如: ```java try { // 可能抛出异常的代码 } catch ...

    try、catch、finally、return 执行顺序.doc

    try、catch、finally、return 执行顺序的规则是:try 语句用于包装可能抛出异常的代码,catch 语句用于捕捉 try 语句中的异常,finally 语句用于执行一些清理工作,return 语句用于从方法中返回值。finally 语句是在...

    Java-Java异常处理教程

    - 避免在`finally`块中抛出新的异常,这会覆盖`try-catch`块中已有的异常。 10. **资源管理与try-with-resources**:Java 7引入了一种新的异常处理模式,即`try-with-resources`,它可以自动关闭实现了`...

    jni方法里面抛出异常

    - 本地方法抛出异常后,Java方法栈上的所有finally块都不会执行,这是与Java异常处理的一个关键区别。 综上所述,理解和掌握JNI中的异常处理是Android开发中的重要技能,它能帮助开发者在混合编程时更好地处理错误...

    JAVA中异常处理的WORD文档

    在这个结构中,`try`块包含可能抛出异常的代码,`catch`块捕获并处理特定类型的异常,`finally`块确保在任何情况下都会执行,如关闭文件流或释放资源。 3. 异常处理流程 当一个异常发生时,Java会创建一个异常对象...

    深入理解java异常处理机制Java开发Java经验技巧共

    如果try块中的代码没有抛出任何异常,或者抛出的异常与任何catch块不匹配,那么catch块将被跳过。 `finally`块包含的代码无论是否发生异常都会被执行,通常用于资源清理,如关闭文件或网络连接。即使在try或catch块...

Global site tag (gtag.js) - Google Analytics