断言抛出不适用于方法参考

时间:2020-05-23 07:34:06

标签: java lambda nullpointerexception optional method-reference

当我尝试运行此程序时-一切正常,测试成功通过:

@Test
public void shouldThrowNPE() {
    @SuppressWarnings("OptionalAssignedToNull") Optional<String> nullOptional = null;
    Assertions.assertThrows(NullPointerException.class, () -> nullOptional.isEmpty());
}

但是对于这个,当我将 lambda 更改为方法参考时,我会收到 NPE 并且测试失败:

@Test
public void shouldThrowNPE() {
    @SuppressWarnings("OptionalAssignedToNull") Optional<String> nullOptional = null;
    Assertions.assertThrows(NullPointerException.class, nullOptional::isEmpty);
}

有人可以提示这是怎么回事。

1 个答案:

答案 0 :(得分:0)

我并不是真正理解Java方法引用表达式的专家,但是我的理论是,对实例方法的引用要求在创建表示要执行的代码的方法句柄之前需要访问实例本身。这就是NPE在执行assertThrows(..)之前发生的原因,因此NPE无法被其捕获。