`
shawnccx
  • 浏览: 165618 次
  • 性别: 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的执行关系

    finally语句块与return的执行关系

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

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

    try-catch-finally执行顺序验证

    try-catch-finally执行顺序验证(左边是....(2)如果finally中无return则执行return var,finally块中的操作不会影响var的值(如果var的值是对象的内存地址,则finally块的操作可以改变该对象的属性值)。 验证 1.基本类型

    java大厂面经、直击BAT

    比较爱考的是 finally 里没有 return 语句,这时虽然 finally 里对 return 的值进行了修改,但 return 的值并不改变这种情况 ## 三.finally代码块和finalize()方法有什么区别? 无论是否抛出异常,finally代码块...

    trycatchfinaly

    3. 但是如果有 finally块的话,那么,finally 几乎是必定会执行的,但是这里有一个先后顺序的问题,应该是 finally 块和 打印异常堆栈将会在另外一个线程之中执行,所以 打印的顺序就很有意思了。 4. 如果在try或者...

    C#中的yield关键字的使用方法介绍

    yield不能单独放在try-catch块中,如果try中有yield那么,这个try块后面不许跟着finally块;也不能出现在匿名方法中,所以,看起来yield似乎并不常用,但是也不是不用。我前面有一个关于迭代器的例子《C#中的迭代器...

    net学习笔记及其他代码应用

    声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其...

    JSTL详细标签库介绍

    java异常处理的基础:<BR><BR>java的异常处理适用于在一个方法中能够检测出错误单不能处理错误的情况,这样方法将抛出一个异常(JAVA无法保证“存在”的异常处理程序能够处理某种异常,若“存在”,就“捕获”异常,...

    java经典面试2010集锦100题(不看你后悔)

    B) 在Java中布尔类型不能和数字之间不能来回转换,即false和true不对应任何零或非零的值。 C) 双精度类型double比单精度类型float具有更高的精度和更大的表示范围,但float类型具有速度快、占用内存小的优点。 D) 在...

    java 面试题 总结

    声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其...

    Java问题宝典2012版

    38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 27 39、下面的程序代码输出的结果是多少? 28 40、final, finally, finalize的区别。 30 ...

    JAVA面试题最全集

    被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载 finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    在程序设计语言中,把定义数据类型的能 力作为一种很重要的能力来对待。在面向对象的语言中,类的功能更强大,这是因为类不仅 含有定义数据类型的功能,而且还包含了对方法的定义。 对象实际是类中的一个实例。生成...

    超级有影响力霸气的Java面试题大全文档

     声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,...

    Python上下文管理器和with块详解

    finally 子句中的代码通常用于释放重要的资源,或者还原临时变更的状态。 ==上下文管理器协议包含enter和exit两个方法==。 with 语句开始运行时,会在上下文管理器对象上调用enter方法。 with 语句运行结束后,会在...

    java面试宝典2012版.pdf

    38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 39、下面的程序代码输出的结果是多少? 40、final, finally, finalize的区别。 41、...

    java是去蜗牛还是源码时代-JavaInterviewQuestions:Java面试题

    finally代码是在return之后还是之前执行? throws是获取异常,throw是抛出异常,try是将会发生异常的语句括起来,从而进行异常的处理, catch是如果有异常就会执行他里面的语句,而finally不论是否有异常都会进行...

    二十三种设计模式【PDF版】

    会 Java 的人越来越多,但是一直徘徊在语言层次的程序员不在少数,真正掌握 Java 中接口或抽象类的应用不是很多,大家 经常以那些技术只适合大型项目为由,避开或忽略它们,实际中,Java 的接口或抽象类是真正体现 ...

    Java面试宝典2010版

    38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 39、下面的程序代码输出的结果是多少? 40、final, finally, finalize的区别。 41、...

    SelBlocks:Selenium IDE 的 SelBlocks 扩展

    elseIf , else try , catch , finally , throw for , foreach , while , continue , break call , function , return loadJsonVars , loadXmlVars , forJson , forXml exitTest 函数和循环参数使用块本地的...

Global site tag (gtag.js) - Google Analytics