借用和窃取其他语言的概念和想法总是很高兴的。 Scala的Option是我真正喜欢的一个主意,因此我用Java编写了一个实现。 它包装了一个可能为null或不为null的对象,并提供了一些可按某种功能使用的方法。 例如,isDefined方法添加了一种面向对象的方式来检查值是否为null。 然后在其他地方使用它,例如getOrElse方法,该方法基本上说“给我您要包装的内容,如果没有,则回退”。

public T getOrElse(T fallback)
{return isDefined() ? get() : fallback;
}

实际上,这将替代传统的Java,例如

public void foo()
{String s = dao.getValue();if (s == null){s = 'bar';}System.out.println(s);
}

与更简洁和面向对象

public void foo()
{Option<String> s = dao.getValue();System.out.println(s.getOrElse('bar'));
}

但是,如果我想做一个除获得后备值之外的事情-抛出异常,该怎么办? 更重要的是,如果我要抛出特定类型的异常(即使用中特定且未硬编码到Option中)怎么办? 这需要一点技巧,并需要进行类型推断。

因为这是Java,所以我们可以从一个新工厂– ExceptionFactory开始。 这是一个基本的实现,仅创建使用消息构造的异常,但是您当然可以根据需要扩展代码。

public interface ExceptionFactory <E extends Exception>
{E create(String message);
}

注意<E extended Exception> –这是它如何工作的关键。 使用工厂,我们现在可以向Option添加新方法:

public <E extends Exception> T getOrThrow(ExceptionFactory<E> exceptionFactory,String message) throws E
{if (isDefined()){return get();}else{throw exceptionFactory.create(message);}
}

同样,请注意引发E –这是从异常工厂推断出来的。

不管您信不信,这就是所需费用的90%。 一种烦恼是需要异常工厂。 如果您能忍受这一切,那么一切都准备就绪。 让我们定义几个自定义异常,以了解实际情况。

public <E extends Exception> T getOrThrow(ExceptionFactory<E> exceptionFactory,String message) throws E
{if (isDefined()){return get();}else{throw exceptionFactory.create(message);}
}

与可疑的ExceptionB类似

public class ExceptionB extends Exception
{public ExceptionB(String message){super(message);}public static ExceptionFactory<ExceptionB> factory(){return new ExceptionFactory<ExceptionB>(){@Overridepublic ExceptionB create(String message){return new ExceptionB(message);}};}
}

最后,将它们放在一起:

public class GenericExceptionTest
{@Test(expected = ExceptionA.class)public void exceptionA_throw() throws ExceptionA{Option.option(null).getOrThrow(ExceptionA.factory(),"Some message pertinent to the situation");}@Testpublic void exceptionA_noThrow() throws ExceptionA{String s = Option.option("foo").getOrThrow(ExceptionA.factory(),"Some message pertinent to the situation");Assert.assertEquals("foo",s);}@Test(expected = ExceptionB.class)public void exceptionB_throw() throws ExceptionB{Option.option(null).getOrThrow(ExceptionB.factory(),"Some message pertinent to the situation");}@Testpublic void exceptionB_noThrow() throws ExceptionB{String s = Option.option("foo").getOrThrow(ExceptionB.factory(),"Some message pertinent to the situation");Assert.assertEquals("foo",s);}
}

如上以粗体突出显示的那样,需要注意的重要一点是方法签名中声明的异常是特定的–它不是共同的祖先(Exception或Throwable)。 这意味着您现在可以在任何地方的DAO层,服务层中使用“选项”,并在需要的地方和方式中抛出特定的异常。

下载源 :您可以从此处获取源代码和测试– Genex

边注
编写此书后产生的另一件有趣的事情是观察到可以执行此操作:

public void foo()
{throw null;
}public void bar()
{try{foo();}catch (NullPointerException e){...}
}

不用说,这不是一个好主意。

参考: Objectify博客上的JCG合作伙伴 Steve Chaloner 推断出Java中的异常 。

翻译自: https://www.javacodegeeks.com/2013/01/inferred-exceptions-in-java.html

Java中的推断异常相关推荐

  1. java中无法推断类型参数_Java中的推断异常

    java中无法推断类型参数 借用和窃取其他语言的概念和想法总是很高兴的. Scala的Option是我真正喜欢的一个主意,因此我用Java编写了一个实现. 它包装了一个可能为null或不为null的对 ...

  2. java中无法推断类型参数_Java 10中的本地类型推断,或者如果它像鸭子一样嘎嘎叫...

    java中无法推断类型参数 最近,Oracle采用了一种新策略,即每六个月发布一次新的语言版本. 该策略假定只有每个第3版都将提供长期支持或LTS. 快速说明: 具有LTS的当前版本是Java 8: ...

  3. unchecked异常_为什么要在Java中使用Unchecked异常而不是Checked异常

    unchecked异常 关于检查与未检查的异常的争论可以追溯到过去. 有人说这是Java包含的最佳功能之一. 其他人则说这是他们最大的错误之一[ 1 ]. 辩论似乎结束了. 在这篇文章中,我将尝试包含 ...

  4. 为什么要在Java中使用Unchecked异常而不是Checked异常

    关于检查与未检查的异常的争论可以追溯到过去. 有人说这是Java包含的最佳功能之一. 其他人则说这是他们最大的错误之一[ 1 ]. 辩论似乎结束了. 在这篇文章中,我将尝试包含指向该主题的文章和书籍的 ...

  5. java if (name!=null name!=),java中的NullPointerException异常

    java中的NullPointerException异常 关注:176  答案:3  mip版 解决时间 2021-01-27 20:59 提问者侢遇噹姩揂 2021-01-27 02:10 Logi ...

  6. java 异常 中英文_史上最全的Java中所有Exception异常中英文对照

    Java中所有Exception异常中英文对照AclNotFoundException, 如果对不存在的访问控制列表进行访问,则会 ArithmeticException 算数异常 ArrayInde ...

  7. java中两种异常类型_Java中的三种异常类型

    java中两种异常类型 Errors are the bane of users and programmers alike. Developers obviously don't want thei ...

  8. Java基础学习系列--(七)彻底搞懂java中的【异常、线程】的使用

    第一章 异常 1.1 异常概念 异常,就是不正常的意思.在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响.在程序中的意思就是: 异常 :指的是程序在执行过程中, ...

  9. 如何处理 Java 中的 NumberFormat 异常

    NumberFormatException是 Java 中的未经检查的异常,当尝试将格式不正确的字符串转换为数值时发生.因此,当无法将字符串转换为数字类型(例如 int.float)时会引发此异常.例 ...

最新文章

  1. FDA转向AI加快药物研发和审批速度
  2. WIN7下黑苹果懒人版硬盘安装not a HFS partition注意问题
  3. Mongoose源码剖析:外篇之web服务器
  4. 常用3种数据库的Sql分页
  5. CentOS7 使用tab建补全命令
  6. SChema中group指示器的使用
  7. 大学物理实验习题+答案/缓慢更新
  8. unable to save settings.xml error 拒绝访问
  9. 用C语言实现万年历的代码及思路(详细教程)
  10. GIS应用技巧之空间插值理论介绍
  11. Hash表的存储结构
  12. 综述文章笔记——《A Survey on Traffic Signal Control Methods》等
  13. Excel宏的介绍及应用
  14. 【解决方案】Ubuntu18.04 安装L2TP及相关设置
  15. 基于ssm与maven,使用easyui--tree生成类似部门管理树形结构图
  16. SX1278 Lora网关
  17. 华为应用市场APP上架流程
  18. JDBC的操作步骤和实例
  19. 设备管理器中英特尔智音技术有黄色感叹号解决办法
  20. 程序员怎样才能实现财富自由

热门文章

  1. householder变换qr分解matlab_【基础教程】Matlab实现傅里叶变换
  2. MySQL检索数据(过滤+通配符+正则表达式)
  3. Java IO(BIO, NIO, AIO) 总结
  4. java 谓词_谓词::不适合Java
  5. aws lambda使用_使用AWS Lambdas扩展技术堆栈
  6. spring多个视图解析器_在Spring中配置多个View解析器
  7. jcache_随机JCache内容:多个提供程序和JMX Bean
  8. jdk8 字符串_在JDK 8中连接字符串
  9. 如何从头开始以正确的面向对象方式创建Java Web Framework
  10. 比较Java REST文档框架