处理异常功能样式

Java从一开始就支持检查异常。 在Java 8中,语言元素lambda和支持流操作的RT库修改将功能编程风格引入了该语言。 函数样式和异常并不是真正的好朋友。 在本文中,我将描述一个简单的库,该库在某种程度上类似于使用Optional处理null方式处理异常。

该库有效(毕竟它是单个类和一些内部类,但实际上不是很多)。 另一方面,我不是绝对确定使用该库不会降低普通程序员的编程风格。 可能会有人用锤子把所有东西都看成是钉子。 锤子不是很好的修脚工具。 看看这个库更像是一个想法,而不是作为一个告诉您如何创建完美的代码处理异常的最终工具。

处理检查的异常

已检查的异常必须像感冒一样被声明或捕获。 这是与null的主要区别。 评估表达式可以静默为null但不能静默引发已检查的异常。 当结果为null我们可以使用它来表示没有值,或者我们可以检查并使用“默认”值代替null 。 这样做的代码模式是

 var x = expression;  if ( expression == null ){ x = expression that is really never null default expression that is really never  } 

模式表达式是相同的,尽管Java语法略有不同,但表达式的求值可能会引发检查异常。

 Type x; // you cannot use 'var' here  try { x = expression  } catch (Exception weHardlyEverUseThisValue){ x = expression that does not throw exception default expression that does not  } 

如果第二个表达式也可以为null或可能引发异常,并且如果第一个表达式失败,我们需要第三个表达式甚至更多个表达式进行评估,则结构可能会更复杂。 由于许多括号,在抛出异常的情况下,这尤其顽皮

 Type x; // you cannot use 'var' here  try { try { x = expression1 } catch (Exception e){ try { x = expression2 } catch (Exception e){ try { x = expression3 } catch (Exception e){ x = expression4 }}}} catch (Exception e){ x = expression that does not throw exception default expression that does not  } 

对于null处理,我们有Optional 。 解决百万美元的问题并不是完美的,这是设计一种既没null又被低估的语言的名称,但是如果使用得当,它会使生活变得更好。 (更糟糕的是,如果使用错误的方式,您可以随意地说,我在本文中所描述的正是这种方式。)

如果结果表达式为null ,则可以编写

 var x = Optional.ofNullable(expresssion) .orElse( expression that does not throw exception); default expression that does not exception); 

你也可以写

 var x = Optional.ofNullable(expresssion1)  .or( () -> Optional.ofNullable(expression2))  .or( () -> Optional.ofNullable(expression3))  .or( () -> Optional.ofNullable(expression4))  ...  .orElse( expression that does not throw exception); default expression that does not exception); 

当您有很多替代值时。 但是,如果表达式引发异常,则您不能做同样的事情。 可以吗

极好的

Exceptional ( https://github.com/verhas/exceptional )

 < groupId >com.javax0</ groupId >  < artifactId >exceptional</ artifactId >  < version >1.0.0</ version > 

实现了在Optional实现的所有方法,一个或多个实现了某些方法,并且某些方法的目的有所不同,旨在在异常情况下使用相同的方式,如上面针对null值的Optional

您可以使用Exceptional.of()Exceptional.ofNullable()创建一个Exceptional值。 重要的区别在于,论点不是价值,而是提供价值的供应商。 该供应商不是JDK Supplier因为该Supplier无法引发异常,因此整个库将无用。 此供应商必须是Exceptional.ThrowingSupplier ,它与JDK Supplier完全相同,但方法get()可能会抛出Exception 。 (另请注意,只有一个Exception ,而不是Throwable正如你用裸手搭上了烧红的铁球,你应该只捕捉尽可能频繁。)

在这种情况下,您可以写的是

 var x = Exceptional.of(() -> expression) // you CAN use 'var' here .orElse( expression that does not throw exception); default expression that does not exception); 

它越来越短,通常更容易阅读。 (或者不是?这就是为什么APL如此受欢迎?或者是?您问什么是APL?)

如果您有多种选择,可以写

 var x = Exceptional.of(() -> expression1) // you CAN use 'var' here .or(() -> expression2) .or(() -> expression3) // these are also ThrowingSupplier expressions .or(() -> expression4)  ... .orElse( expression that does not throw exception); default expression that does not exception); 

如果某些供应商可能会导致null不仅引发异常,则有方法的ofNullable()orNullable()变体。 ( orNullable()Optional中不存在,但在这里,如果整个库都可以使用,则是有意义的。)

如果您熟悉Optional并使用更高级的方法,如ifPresent()ifPresentOrElse()orElseThrow()stream()map()flatMap()filter()那么使用Exceptional并不困难。 类中存在具有相同名称的类似方法。 再次不同的是,如果Optional的方法的参数为Function ,则为Exceptional时为ThrowingFunction 。 利用这种可能性,您可以编写如下代码

 private int getEvenAfterOdd( int i) throws Exception { if ( i % 2 == 0 ){ throw new Exception(); } return 1 ; } @Test @DisplayName ( "some odd example" ) void testToString() { Assertions.assertEquals( "1" , Exceptional.of(() -> getEvenAfterOdd( 1 )) .map(i -> getEvenAfterOdd(i+ 1 )) .or( () -> getEvenAfterOdd( 1 )) .map(i -> i.toString()).orElse( "something" ) ); } 

也可以像下面的示例一样处理函数表达式中的异常:

 private int getEvenAfterOdd( int i) throws Exception { if (i % 2 == 0 ) { throw new Exception(); } return 1 ; } @Test void avoidExceptionsForSuppliers() { Assertions.assertEquals( 14 , ( int ) Optional.of( ).map(i -> 13 ).map(i -> Exceptional.of(() -> inc(i)) .orElse( 0 )).orElse( 15 )); } 

最后但并非最不重要的一点是,您可以模仿?. Groovy写作的运营商

 abcdef 

表达式(其中所有变量/字段都可能为null并通过它们访问下一个字段)会导致NPE。 您可以但是写

 var x = Exceptional.ofNullable( () -> abcdef).orElse( null ); 

摘要

记住我对锤子说的话。 小心使用,并获得更大的利益。

翻译自: https://www.javacodegeeks.com/2019/05/handling-exceptions-functional-style.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言项目:灰度处理技术

Hello&#xff0c;今天给大家带来的是一个比较简单的图形处理技术-灰度处理技术。那么到底什么是灰度处理技术呢&#xff1f;简单来说&#xff0c;所谓的灰度处理技术就是把一张彩色的图片变成一张灰色的图片。如下图所示&#xff0c;左边是原图&#xff0c;右边则是已经被处理…

java 设置文本颜色_在Java中更改文本的颜色

添加到我的评论&#xff1a;1)您不应该通过调用paintComponent(..)方法的super.XXX实现来尊重paint链,它应该是覆盖方法中的第一个调用,否则可能发生异常&#xff1a;Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);Font font new Font("S…

C语言项目:推箱子大战

还记得大家小时候玩过的游戏吗&#xff1f;曾经的坦克大战、推箱子、贪吃蛇都是我们以前玩过的小游戏&#xff0c;然而现在随着大型单机、网络游戏的光芒照耀下&#xff0c;那些曾经的小游戏都渐渐消失了&#xff0c;也或许是我们都已经长大了吧。那么今天&#xff0c;我给大家…

在Spring@Component vs @Repository vs @Service

介绍&#xff1a; 借助Spring的自动扫描功能&#xff0c;它可以自动检测我们的应用程序中定义的各种bean。 我们通常使用可用的Spring注释之一来注释我们的bean- Component&#xff0c; Repository&#xff0c; Service&#xff0c; Controller 。 在检测到bean时&#xff0c;…

java项目加减乘除验证码_课堂Java小程序(加减乘除与验证码)

一、编写一个程序&#xff0c;用户输入两个数&#xff0c;求出其加减乘除&#xff0c;并用消息框显示计算结果。1.设计思想&#xff1a;从键盘输入两个数字和运算符&#xff0c;然后计算。将输入的数字及运算符由字符型转换为整型&#xff0c;再用if判断输入的运算符&#xff0…

C语言绘图:可爱叮当猫

大家对于叮当猫可以说是很熟悉了吧&#xff0c;他还有另外一个名字&#xff0c;也就是哆啦a梦。即便你没有看过他的电影动画&#xff0c;也总会听说过的。叮当猫神奇的口袋总是能够掏出我们幻想功能的任何道具&#xff0c;任意门能够带我们去到任何地方&#xff0c;以及插在头上…

jgit git pull_使用JGit API探索Git内部

jgit git pull您是否想过提交及​​其内容如何存储在Git中&#xff1f; 好吧&#xff0c;我有&#xff0c;在上一个下雨的周末我有一些空闲时间&#xff0c;所以我做了一些研究。 因为我对Java的感觉比对Bash的感觉要多&#xff0c;所以我使用JGit和一些学习测试来探究提交的G…

MFC实现Windows锁屏

编辑Windows锁屏锁屏软件相信大家都见过&#xff0c;以前我去网吧上网的时候也用过这个功能&#xff0c;当你有事情需要立即离开&#xff0c;而又不想让别人碰你的电脑&#xff0c;就需要用扫锁屏软件啦&#xff0c;锁住屏幕之后等回来的时候再输入密码解锁。同样的&#xff0c…

pdf 截图 java_java实现pdf文件截图的方法【附PDFRenderer.jar下载】

本文实例讲述了java实现pdf文件截图的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;最近做的一个网站中&#xff0c;有个需求是上传pdf文件&#xff0c;显示pdf的封页&#xff0c;点击封页之后进行在线阅读&#xff0c;这里使用的是PDFRender对pdf进行截图。pub…

检查Java测试中发生了什么

有人想到了在Java单元测试中使用try和catch块的想法&#xff1a; Test public void test() { try { callSomeCode(); } catch (Exception e) { assertEquals( "foo" , e.getMessage()); } } 上面的内容很诱人&#xff0c;但不起作用 。 如果被测代码没有抛出&…

学习红客技术必备

互联网时代已悄悄来临&#xff0c;作为新时代的人们&#xff0c;我们日常生活、工作、学习方面都需要借助互联网来完成&#xff0c;这样&#xff0c;又产生一种新的问题&#xff0c;那就是网络安全的问题&#xff0c;有时我们拼命加班好不容易完成的东西&#xff0c;在一夜之间…

md5withrsa java_浏览器运行java插件报错:Algorithm constraints check failed: MD5withRSA

今天使用kvm管理机房机器的时候发现一只连不上&#xff0c;报以下错误&#xff1a;sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: Algorithm constraints check failed: MD5withRSA我确认我已经把…

jpa 实体映射视图_JPA教程:实体映射-第3部分

jpa 实体映射视图在上一篇文章中&#xff0c;我展示了两种读取/写入持久实体状态的不同方法-字段和属性。 使用字段访问模式时&#xff0c;JPA使用反射直接从实体的字段读取状态值。 如果我们没有明确指定列名&#xff0c;它将直接将字段名转换为数据库列名。 在属性访问模式下…

今晚课题:2019-3-20

今晚课题C/C万年历技术实现原理上课时间&#xff1a;20:30--22:30上课老师&#xff1a;杰越教育-Larry老师上课地址&#xff1a;https://ke.qq.com/course/353889 课程内容&#xff1a;1、C/Cfor逻辑原理2、重要点数据结构分析3、万年历效果实现展示赢在别人休息时&#xff0c;…

python在材料模拟中的应用_材料模拟python_模拟-python模拟-在不妨碍实现的情况下修补方法...

此答案解决了Quuxplusone用户提供的赏金中提到的其他要求&#xff1a;对于我的用例而言&#xff0c;重要的是它可以与MagicMock一起使用&#xff0c;即&#xff0c;它不需要我在构造Potato(在此示例中为spud)实例与调用spud.foo(在本例中)之间插入任何代码。我需要293984865472…

新版本的Selenium 4 Alpha会有什么期望?

我们所有人都属于测试领域&#xff0c;他们熟悉Selenium&#xff0c;Selenium是业界最流行的开源自动化工具之一。 Selenium的创始成员Simon Stewart在2018年8月正式宣布Selenium 4的发布日期以及它将为用户带来哪些新功能时&#xff0c;我们感到非常兴奋。 与Selenium 3一样&…

今晚课题:2019-3-22

今晚课题数据结构必会重点集合上课时间&#xff1a;20:30--22:30上课老师&#xff1a;杰越教育-Larry老师上课地址&#xff1a;https://ke.qq.com/course/353889 课程内容&#xff1a;1、C/C技术工作运用2、数据结构重点数组定义特点3、工作项目数组合理使用赢在别人休息时&…

java 单例 实现_java 实现单例的各种方式

概述上一篇日志中&#xff0c;我们介绍了单例模式的概念和基础的应用本节中&#xff0c;我们就来介绍一下 java 语言中如何编写单例模式类只适合单线程环境的单例模式public class Singleton {private static Singleton instance null;private Singleton() { }public static S…

Drools DMN最新开源引擎性能改进

我们一直在寻求改善Drools DMN开源引擎的性能。 我们最近审查了DMN用例&#xff0c;其中输入数据节点的实际输入总体有所不同。 这突出显示了引擎的次佳性能&#xff0c;我们在最新版本中对此进行了改进。 我想分享我们的发现&#xff01; 基准制定 当我们开始为该用例运行一个…

今晚课题:2019-3-23

今晚课题剖析《服务器高并发-IOCP模型架构》上课时间&#xff1a;2019/03/23 20:30--22:30授课讲师&#xff1a;杰越教育C/C学院--Vico课程链接&#xff1a;https://ke.qq.com/course/353889?tuin7472c9c 课程内容&#xff1a; 1、C/C编程语言入门精通 2、C线程技术在服务器…