在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。

Java 8星期五

每个星期五,我们都会向您展示一些不错的教程风格的Java 8新功能,这些功能利用了lambda表达式,扩展方法和其他好东西。 您可以在GitHub上找到源代码 。

更好的例外

当我偶然发现JUnit GitHub问题#706时 ,我有了这个主意,它是关于一个新方法的建议:

ExpectedException#expect(Throwable, Callable)

一种建议是为此类异常创建拦截器。

assertEquals(Exception.class, thrown(() -> foo()).getClass());
assertEquals("yikes!", thrown(() -> foo()).getMessage());

另一方面,为什么不只是按照这种方式添加全新的内容呢?

// This is needed to allow for throwing Throwables
// from lambda expressions
@FunctionalInterface
interface ThrowableRunnable {void run() throws Throwable;
}// Assert a Throwable type
static void assertThrows(Class<? extends Throwable> throwable,ThrowableRunnable runnable
) {assertThrows(throwable, runnable, t -> {});
}// Assert a Throwable type and implement more
// assertions in a consumer
static void assertThrows(Class<? extends Throwable> throwable,ThrowableRunnable runnable,Consumer<Throwable> exceptionConsumer
) {boolean fail = false;try {runnable.run();fail = true;}catch (Throwable t) {if (!throwable.isInstance(t))Assert.fail("Bad exception type");exceptionConsumer.accept(t);}if (fail)Assert.fail("No exception was thrown");
}

因此上述方法都断言从给定的runnable – ThrowableRunnable抛出了给定的throwable,因为不幸的是,大多数功能接口都不允许抛出检查异常。 有关详细信息,请参见本文 。

现在,我们使用上述假设的JUnit API:

assertThrows(Exception.class, () -> { throw new Exception(); });assertThrows(Exception.class, () -> { throw new Exception("Message"); },e  -> assertEquals("Message", e.getMessage()));

实际上,我们甚至可以更进一步,声明一个吞下此类辅助方法的异常,如下所示:

// This essentially swallows exceptions
static void withExceptions(ThrowableRunnable runnable
) {withExceptions(runnable, t -> {});
}// This delegates exception handling to a consumer
static void withExceptions(ThrowableRunnable runnable,Consumer<Throwable> exceptionConsumer
) {try {runnable.run();}catch (Throwable t) {exceptionConsumer.accept(t);}
}

这对于吞噬各种异常很有用。 因此,以下两个习惯用法是等效的:

try {// This will failassertThrows(SQLException.class, () -> {throw new Exception();});
}
catch (Throwable t) {t.printStackTrace();
}withExceptions(// This will fail() -> assertThrows(SQLException.class, () -> {throw new Exception();}),t -> t.printStackTrace()
);

显然,这些习惯用法不一定比实际的try .. catch .. finally块有用,特别是因为它不支持异常的正确键入(至少在此示例中不支持),也不支持try-with -resources语句。

但是,此类实用程序方法有时会派上用场。

翻译自: https://www.javacodegeeks.com/2014/05/java-8-friday-better-exceptions.html

Java 8 Friday:更好的异常相关推荐

  1. java se好用吗_利用 Java SE 7 更好地管理资源

    2011 年 5 月发布 作者:Julien Ponge 本文介绍 Java 7 针对自动资源管理问题给出的解决办法,即 Coin 项目中提出的新语言结构 try-with-resources 语句. ...

  2. java中检查性异常类_Java异常处理、java语言推崇使用检查类型异常

    异常处理是java语言的重要特性之一,<Three Rules for effective Exception Handling>一文中是这么解释的:它主要帮助我们在debug的过程中解决 ...

  3. 《深入理解java虚拟机》第2章 Java内存区域与内存溢出异常

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来. 2.1 概述 https://blog.csdn.net/q5706 ...

  4. 【深入理解Java虚拟机学习笔记】第二章 Java 内存区域与内存溢出异常

    最近想好好复习一下java虚拟机,我想通过深读 [理解Java虚拟机 jvm 高级特性与最佳实践] (作者 周志明) 并且通过写一些博客总结来将该书读薄读透,这里文章内容仅仅是个人阅读后简短总结,加强 ...

  5. JAVA day24,25,26 异常(try、catch、finally、throw、throws),线程(Thread、Runnable、Callable)

    一.异常 异常 :指的是程序在执⾏过程中,出现的⾮正常的情况,最终会导致JVM的⾮正常停⽌. 在Java等⾯向对象的编程语⾔中,异常本身是⼀个类,产⽣异常就是创建异常对象并抛出了⼀个 异常对象.Jav ...

  6. java中三种可能导致异常的情况_JAVA基础知识点之异常

    一.JAVA异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描 ...

  7. java集合,多线程,面向对象,枚举类,异常等所有常用的方法总和

    extends //继承 Instanceof //多态里面的比较是否new 的对象为他 abstract //抽象类 final // 不可修改,最终的 如果在类前面加那么表示此类不可以被继承 st ...

  8. Java内存区域与内存溢出异常

    Java内存区域与内存溢出异常 Java与C++之间有一堵由内存动态分配和垃圾收集技术围城的"高墙",墙外的人想进去,墙里的人却想出来 概述 对于C.C++程序开发人员来说,在内存 ...

  9. 一个编程小白的Java SE学习日志 Ⅷ——接口、异常【极客BOY-米奇】

    文章目录 前言(转载请说明作者!)4.9~4.16编写 接口 概念 定义 实现 使用场合 设计模式 适配器设计模式 简单工厂设计模式 异常 Java如何处理异常 使用try..catch结构捕获异常 ...

  10. 《深入理解JAVA虚拟机》详细解读(第二章 ):JAVA内存区域与内存溢出异常

    目录 一.JAVA内存区域与内存溢出异常 1. 概述 2. 运行时数据区域 2.1 程序计数器 2.2 Java虚拟机栈 2.3本地方法栈 2.4 堆 2.5 方法区 2.6 运行时常量池 2.7直接 ...

最新文章

  1. 论设计,需求和编码三者的关系
  2. tcp/ip 协议栈Linux内核源码分析九 IPv6分片ip6_fragment 分析
  3. 【Python】如何在文件夹里批量替换文本中的内容?
  4. Java面向对象(2) —— 继承
  5. php如何打出的正方形行列,javascript实现输出指定行数正方形图案的方法
  6. 安徽工程大学专升本计算机科学与技术专业,2015年安徽工程大学机电学院的计算机科学与技术专业怎么样...
  7. 调用服务器直接打印文件,使用 LP 打印命令设置直接连接的打印机
  8. Topaz Sharpen AI 人工智能锐化插件
  9. 用最火的python实现最常用、最靓、最实用图表~~
  10. 苹果手机怎么设置信号服务器,苹果手机信号怎么改成数字 方法介绍
  11. vmd安装包_浅谈VMD(变分模态分解)
  12. 利用Host-only模式使用虚拟机静态IP上网
  13. 华为OD机试真题 Python 实现【数字涂色】
  14. MUI-轮播插件实现-UI组件
  15. 浏览器推荐-以Windows操作系统为例
  16. 5GNR漫谈14:TM一致性测试
  17. 深入浅入 ~ ConCurrentHashMap底层原理透析
  18. Brpc代码分析-Server端(九)
  19. csharp高级练习题:ASCII85编解码【难度:3级】--景越C#经典编程题库,不同难度C#练习题,适合自学C#的新手进阶训练
  20. 什么是网络免费2.0?

热门文章

  1. SparkSQL中UDAF案例分析
  2. eclipse maven 项目发布到tomcat 报错 Failed to scan JAR [file:/C:/xxxxx.jar] from WEB-INF/lib
  3. java 邮件 tls_通过TLS发送的Java邮件
  4. elk入门_ELK堆栈入门
  5. jdk 安全属性_系统属性的JDK 12 Javadoc标记
  6. esb 和 开源esb_如果今天完成,ESB会是什么样子?
  7. 数据库连接配置tomcat_Tomcat到Wildfly:配置数据库连接
  8. AWS Lambda事件源映射:使您的触发器混乱无序
  9. 具有外部Zookeeper集成并使用SOLRJ API访问数据的SOLR cloud 7.4集群配置
  10. 如何使用Java和XML Config在Spring Security中启用HTTP基本身份验证