微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

提供lambda参数时,为什么必须捕获异常?

如何解决提供lambda参数时,为什么必须捕获异常?

请考虑以下示例:

@PUT
@Path("/test")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "swagger description",notes = "swagger notes",response = TestResponse.class)
public Response saveOrUpdateTest(@QueryParam("a") String a,Test test) {
    DataServiceFactory dataServiceFactory = getDataServiceFactory();
    return dataServiceFactory.getTestDataService().saveOrUpdateTest(test);
}

这里是一个问题:上例中的lambda参数是一个对象,稍后将在“ display()”方法内执行该对象。将参数传递给“ display()”时显然不会执行。

为什么编译器拒绝它?我认为用try ... catch包围它是非常合理的,仅在实际调用lambda时才捕获。

解决方法

这是因为Supplier功能接口的签名:

T get();

如您所见,方法get并未声明抛出Exception(没有其他 checked 异常)。

在Java中,存在已检查未检查异常(未检查的异常是从RuntimeException继承的异常)。必须通过在catch块中捕获已检查的异常,或者通过声明方法throws来处理该异常。

如果Supplier.get的签名是:

T get() throws Exception:

代码可以正常编译。

尝试抛出RuntimeException而不是Exception,代码可以正常编译。


编辑:根据彼得·劳瑞(Peter Lawrey)在评论中的建议,如果您确实需要在lambda表达式中抛出一个已检查的异常,则可以使用例如Callable,其唯一的一种方法签名如下:

T call() throws Exception;

您只需要将Callable传递给display方法,而不是Supplier

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。