finally块

尽管JVM是基于堆栈的计算机 ,但Java语言实际上并没有为您提供任何访问该堆栈的方法。 即使有时在极少数情况下,它也将非常有用。

一个例子

方法结果值放在堆栈中。 如果查看以下示例:

public int method() {if (something)return 1;...if (somethingElse)return 2;...return 0;
}

如果我们忽略了停机问题 ,错误处理,以及其他学术讨论,我们可以说,上述方法将“肯定”返回的任何值120 。 并且该值在退出该方法之前被放入堆栈中。

现在,有时候,仅当返回给定结果值时才执行某些操作可能是一个用例。 然后,可能会诱使人们开始关于是否有多个return语句为EVIL™的古老争论 ,而整个方法的措辞应如下所示:

public int method() {int result = 0;if (something)result = 1;...if (somethingElse)result = 2;...// Important action here prior to returnif (result == 1337)log.info("hehehe ;-)");return result;
}

当然,上面的示例是错误的,因为以前, if (something) return 1if (something) return 2语句则立即中止方法执行。 为了使用“单返回语句”技术实现相同的目的,我们必须像这样重写代码:

public int method() {int result = 0;if (something)result = 1;else {...if (somethingElse)result = 2;else {...}}// Important action here prior to returnif (result == 1337)log.info("hehehe ;-)");return result;
}

…并且,当然,我们可以继续使用花括号和/或压痕水平线进行骑车脱落和警告火焰 ,这表明我们没有获得任何好处。

从堆栈访问返回值

我们在原始实现中真正想做的是在返回之前检查一下堆栈上的值,即将返回什么值。 这是一些伪Java:

public int method() {try {if (something)return 1;...if (somethingElse)return 2;...return 0;}// Important action here prior to returnfinally {if (reflectionMagic.methodResult == 1337)log.info("hehehe ;-)");}
}

好消息是:是的,我们可以! 这是实现上述目标的简单技巧:

public int method() {int result = 0;try {if (something)return result = 1;...if (somethingElse)return result = 2;...return result = 0;}// Important action here prior to returnfinally {if (result == 1337)log.info("hehehe ;-)");}
}

不太好的消息是:您一定不要忘记显式分配结果。 但是每隔一段时间,当Java语言实际上不允许您访问时,此技术对于“访问方法堆栈”非常有用。

当然…

当然,您也可以在这里诉诸无聊的解决方案:

public int method() {int result = actualMethod();if (result == 1337)log.info("hehehe ;-)");return result;
}public int actualMethod() {if (something)return result = 1;...if (somethingElse)return result = 2;...return result = 0;
}

…而且,也许在大多数情况下,这种技术确实更好(因为可读性更高)。 但是有时候,您不仅要登录finally块,还想做更多的事情,或者您想要访问的不仅仅是结果值,而且您不想重构该方法。

其他方法?

现在轮到你了。 您首选的替代方法是什么(带有代码示例?),例如,使用Try monad? 还是方面?

翻译自: https://www.javacodegeeks.com/2015/05/how-to-access-a-methods-result-value-from-the-finally-block.html

finally块

finally块_如何从finally块访问方法的结果值相关推荐

  1. 如何从finally块访问方法的结果值

    尽管JVM是基于堆栈的计算机 ,但Java语言实际上并没有为您提供任何访问该堆栈的方法. 即使有时,在极少数情况下,它也会非常有用. 一个例子 方法结果值放在堆栈中. 如果查看以下示例: public ...

  2. java接口参数默认值_下面关于setMaxAge(int expires)方法参数默认值的描述中,正确的是(5.0分)_学小易找答案...

    [单选题]下面选项中,用于在web.xml中配置监听器的元素是(5.0分) [填空题]Cookie技术用于将会话过程中的数据保存到( )中,从而使浏览器和服务器可以更好地进行数据交互.(5.0分) [ ...

  3. java 非静态语句块_静态初始化代码块与非静态初始化代码块之间的区别是什么?...

    UFF!什么是静态初始化器? 静态初始化程序是static {}Java类中的代码块,并且在调用构造函数或main方法之前只运行一次. 好的!告诉我更多..是一个代码块 static { ... }在 ...

  4. 定义一个名为Rectangle的类表示矩形,其中含有length和width两个double型的成员变量表示长和宽。要求为每一个变量定义访问方法和修改方法......

    标题定义一个名为Rectangle的类表示矩形,其中含有length和width两个double型的成员变量表示长和宽.要求为每一个变量定义访问方法和修改方法,定义求矩形周长的方法getPerimet ...

  5. 直接用自己服务器做图床可以吗_我花 9 块钱搭了一个“私人图床”

    背景 之前一直把简书当做自己的私人"图床"来用,因为简书的Markdown编辑器非常稳定,实时保存加图片ctrl+v复制进去就能用的特征让我一直坚持在简书上首发自己写的东西,然后图 ...

  6. 西门子博图的FB块_西门子S7-300/400PLC OB-FB-FC-DB块介绍

    西门子S7-300/400的PLC用户程序结构与S7-200有明显的不同,可以使用线性化结构以及功能调用式结构与结构化编程. 采用调用式结构与结构化编程时,程序以组织块(OB).程序块(FC).功能块 ...

  7. java 静态代码块_关于Java你不知道的那些事之代码块

    前言 普通代码块:在方法或语句中出现的{},就被称为代码块 静态代码块:静态代码块有且仅加载一次,也就是在这个类被加载至内存的时候 普通代码块和一般语句执行顺序由他们在代码中出现的次序决定,先出现先执 ...

  8. 别踩白块_前端H5游戏毕设

    摘 要 本文详细介绍了网页版躲避白色钢琴块音乐游戏的设计和实现.由于游戏软件安装占据较大的空间与安装时间,而且步骤繁琐,用常规的游戏安装方法不能取得便捷的游戏安装体验.网页游戏是一种基于在网络游戏中被 ...

  9. java 代码块_详解java中的四种代码块

    在java中用{}括起来的称为代码块,代码块可分为以下四种: 一.简介 1.普通代码块: 类中方法的方法体 2.构造代码块: 构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行. ...

最新文章

  1. ionic项目创建打包签名
  2. BZOJ1391: [Ceoi2008]order
  3. Android小项目之--前台界面与用户交互的对接 进度条与拖动条(附源码)
  4. 同步手绘板——将View的内容映射成Bitmap转图片导出
  5. 基于JavaWeb实现网上花店商城系统
  6. Python基础(9)水仙花数
  7. docker 每次都得source /etc/profile以及如何查看Docker容器环境变量、向容器传递环境变量
  8. 打开和关闭Oracle Flashback
  9. C#中Invoke 和 BeginInvoke的涵义和区别
  10. 【codevs1230】元素查找
  11. Java的LockSupport.park()实现分析
  12. android keyevent.java,dispatchKeyEvent简单理解
  13. Android学习笔记---19_采用ListView实现数据列表显示,以及各种适配器使用,和如何写自己的适配器
  14. opencv+python机读卡识别
  15. vue ui没反应如何解决?
  16. nginx下根据指定路由重定向
  17. DJ4 组合逻辑电路与138译码器
  18. 视频水印去除工具哪个好
  19. wps怎么写分段函数_“在Excel中怎么设置分段函数?(有5个分段)“excel折线图颜色...
  20. 抖音收购musical.ly后,最难过的为什么是快手?

热门文章

  1. 【2018.5.19】模拟赛之二-ssl2433 文件名排序【字符串】
  2. ssl2661-廉价最短路径【SPFA】
  3. 2016 Multi-University Training Contest 1 1004 GCD(ST表+二分)
  4. 纪中A组模拟赛总结(2021.7.16)
  5. Summer Training day4上帝与集合的正确用法 欧拉函数+降幂公式
  6. 2017西安交大ACM小学期数论 [阅兵式]
  7. 汇编语言(三十三)之四进制转十进制
  8. JFreeChart(三)之条形图
  9. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Action的实现类
  10. php如何直接使用iview,iview安装使用