`
shawnccx
  • 浏览: 166787 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

不能在finally块中return

F# 
阅读更多
【现象描述】

try-catch块中永远返回finally中return的值
【错误代码】

static boolean f() {
  try {
      return true;
  } finally {
      return false;
  }
}
错误分析
在这个应用场景中,不要用return来退出finally语句块,因为finally语句块都会被执行到,这样try程序块中执行正常也会在finally中退出,不会再回到try程序块中。

Try-catch的流程说明:

try {
    …
    …
    return true;
}catch(异常){ 
   …
} finally {
   …
}
}
1,try-catch-finally,

如果try语句块遇到异常,try下面的代码就不执行了,转而执行catch语句块,执行完再执行finally语句块,最后结束。
2,try-finally,

如果在try语句块中执行到return语句前一条,未遇到异常,转而执行finally语句块,执行完再执行try中的return语句。
不要用return、break、continue或throw来退出finally语句块

正确用法
//该方法返回false

static boolean f() {
  try {
      return true;
  } finally {
     //不做return操作
  }
}
分享到:
评论
3 楼 无愧衾影 2011-03-24  
正确,return 要放在正确的地方
2 楼 jkxydp 2011-03-03  
不好意思,楼主,我这样写也不对,这样程序会把抛出的异常活生生地吃掉,而且我还发现了一个新的问题
public class Test {
public static void main(String[] args) {
try {
System.out.println(k());
} catch (RuntimeException e) {
System.out.println("main:runtime" );
}
}
public static int k() throws RuntimeException{
int x = 0;
try{
System.out.println("try");
throw new RuntimeException("runtime");
} catch (RuntimeException e) {
System.out.println("catch");
x = 1;
throw e;
} finally {
System.out.println("finally");
}

}
}
你看那个k方法,居然没写return语句也能正常执行,编译运行都不报错!
非常迷惑,希望有人能够解释它!
1 楼 jkxydp 2011-03-03  
return语句并非不能在finally里面写,得看怎么写,比如
public int add() {
int flag = 0;
try{
xxxDao.save(XXX);
flag = 1;
}catch(RuntimeException e) {
flag = 2;
threw e;
}finally {
return flag;
}

相关推荐

    java 中finally语句块与return的执行关系

    Java 中 finally 语句块与 return 的执行关系 Java 中的 finally 语句块是用于保证无论出现什么情况,一定要执行的代码块。在 try-catch-finally 结构中,finally 语句块的执行顺序是非常重要的。下面我们来详细...

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

    3. 即使在`finally`块中也有`return`语句,`finally`块中的代码将被执行,然后返回值会被覆盖。这意味着`finally`块的`return`总是会覆盖`try`或`catch`块中的`return`。 现在让我们深入源码层面来进一步理解这个...

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

    在这种情况下,程序会先执行 try 块,如果遇到异常,则执行 catch 块中的 return 语句,但不返回;然后执行 finally 语句中全部代码,最后执行 catch 块中的 return 语句。 情况 4:try{ return; }catch(){} ...

    try-finally-return-in-finally.rar_return

    在JavaScript中,当`try`块中的`return`语句执行时,控制流会立即跳到`finally`块,执行`finally`中的代码。如果`finally`块也有`return`语句,那么它将覆盖`try`块的`return`,返回`finally`块的值。换句话说,最后...

    try-catch-finally-return-in-finally.rar_return

    `finally` 块总是会被执行,即使在 `try` 或 `catch` 中已经有一个 `return` 语句,这使得我们可以确保无论发生什么情况,都能执行必要的清理工作并返回一致的结果。 通过分析 `12.5-1.js` 和 `try-catch-finally-...

    Java中finally块执行与return关系深度剖析

    Java finally语句到底是在return之前还是之后执行?Java finally执行深度剖析,具体看这篇博文:http://blog.csdn.net/lanxuezaipiao/article/details/16922895,这是里面相关的源码,欢迎大家下载使用。

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

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

    浅谈Java中return和finally的问题

    - 变量的修改在 `finally` 语句块中进行,如果不在 `finally` 中使用 `return`,则不会改变已由 `try` 块确定的返回值。 这些规则对于理解和编写健壮的Java代码至关重要,特别是在涉及资源管理、异常处理和程序流程...

    Java的throw和return

    在这个例子中,如果传入的年龄小于0,则会抛出一个`Exception`对象,并附带错误消息“年龄不能为负数”。 #### return关键字 `return`关键字用于从方法中返回一个值或结果。它不仅可以用来结束方法的执行,还可以...

    谈谈Java中try-catch-finally中的return语句

    在Java编程语言中,`try-catch-finally`语句块是异常处理的关键构造,它允许程序员优雅地处理可能出现的异常情况。`return`语句则用于从方法中返回一个值或者结束方法的执行。当这两者结合在一起时,就会出现一些...

    try-catch-finally捕获异常

    finally块总是会被执行,無論try块中是否出现异常。finally块的语法结构如下: ```java finally { // 资源释放或清理操作 } ``` 四、异常处理机制 try-catch-finally语句的异常处理机制可以分为以下几个步骤: ...

    Java异常处理中同时有finally和return语句的执行问题

    当一个方法中出现可能抛出异常的代码时,可以将其放在try块中,catch块用来捕获并处理异常,finally块则确保某些代码无论是否发生异常都会被执行。在涉及finally和return语句时,Java有一些特定的行为规则。 首先,...

    finally结构的注意点(一)

    在编程语言中,`finally` 结构是一种保证代码执行的关键构造,无论程序的其他部分是否抛出异常或者正常结束,`finally` 块中的代码总是会被执行。这对于清理资源,比如关闭文件流或者数据库连接,是至关重要的。在...

    浅谈Java finally语句到底是在return之前还是之后执行(必看篇)

    从结果可以看到,finally 块中的 return 语句会覆盖 try 块中的 return 语句,try 块中的 return 语句就不能返回了。 finally 语句是在 try 的 return 语句执行之后,return 返回之前执行的。 finally 块中的 ...

    使用try-catch-finally处理异常

    4. **finally块** `finally`块是可选的,无论`try`和`catch`块中的代码是否抛出异常,`finally`块里的代码都会被执行。这通常用于资源清理,如关闭文件流、网络连接等。即使在`try`或`catch`块中有return语句,`...

    浅析Python中return和finally共同挖的坑

    但是,由于 `finally` 块的存在,程序在真正返回之前会先执行 `finally` 块中的代码,即 `print('finally')`。 这意味着即使函数即将返回,`finally` 块中的代码仍然会被执行。这对于那些期望函数返回后立即退出的...

    try_catch_finally异常处理java

    即使`try`或`catch`块中存在`return`语句,`finally`块的代码也会被执行。这确保了程序的整洁和资源的有效管理。 在Java中,`try-catch-finally`结构可以单独使用,也可以嵌套使用。嵌套的`try-catch-finally`允许...

    java finally块执行时机全面分析

    在执行`jsr`指令前,返回值会被保存在局部变量中,这样即使`finally`块内部有异常或返回值,也能保证返回一致性。 在实际的JDK8u-25版本的编译器中,虽然字节码可能会有所不同,但基本原理不变。通过查看字节码,...

    final, finally, finalize的区别

    这意味着即使在程序中发生未被捕获的异常,或者在 `catch` 块中执行了 `return` 或 `throw` 操作,`finally` 块中的代码依然会得到执行。`finally` 的典型用途包括释放资源,如关闭文件流、数据库连接等,确保程序...

    关于Java中try finally return语句的执行顺序浅析

    可以看到,finally语句块在try语句块中的return语句之前执行。 finally语句块的执行顺序是非常重要的,需要我们认真地了解和掌握。只有在try语句块得到执行的情况下,finally语句块才会执行,而不是一定会执行的。

Global site tag (gtag.js) - Google Analytics