如何在 lambda Java8 中抛出 Checked Exception? [复制]
Posted
技术标签:
【中文标题】如何在 lambda Java8 中抛出 Checked Exception? [复制]【英文标题】:How to throw Checked Exception inside lambda Java8? [duplicate] 【发布时间】:2019-01-31 07:38:03 【问题描述】:我试图在 lambda 中抛出一个异常,但它一直给我一个错误,说 Unhandled IOException。
private <T> T getResponse(final RestURI query, final Class<T> responseClass) throws IOException
return getValue(query,
reader ->
try
return mapper.readValue(reader, responseClass);
catch (IOException e)
throw new IOException("Exception while deserializing the output " + e.getMessage());
);
谁能告诉我我做错了什么?
【问题讨论】:
无论如何,不要像这样重新抛出:提供e
作为新异常的原因(如果你真的需要的话),以便提供实际的堆栈跟踪例外。
【参考方案1】:
您在getValue()
中使用的功能接口未在此签名中指定IOException
已检查异常。
所以你不能抛出它,因为只有声明的检查异常可能会被抛出在 lambda 体内。
要么创建并使用您自己的声明 IOException
的函数式接口,要么从 lambda 中抛出任何 RuntimeException
实例,这是有效的。
例如 MC Emperor 建议的 UncheckedIOException
。
此外,您应该通过将新异常链接到原因异常来抛出新异常,以将信息保留在 stracktrace 中:
try
return mapper.readValue(reader, responseClass);
catch (IOException e)
throw new UncheckedIOException("Exception while deserializing the output ", e);
【讨论】:
或者抛出一个UncheckedIOException
。
很好的答案,但是初级开发人员最好学会不要默认将RuntimeException
扔到任何地方,因为它缺乏清晰度。在这种情况下,您应该扩展 RuntimeException 并将其命名为 JsonParseException
。如果您不想创建自己的课程,@MCEmperor 也提供了一个优雅的解决方案。但是更喜欢特定领域的类。
@Brad 完全同意打字。但是JsonParseException
已经存在于杰克逊。事实上,OP 想要重新抛出 ObjectMapper.readValue()
抛出的任何异常,这些异常实际上会抛出多种类型的 IOException
:`IOException、JsonParseException、JsonMappingException`。所以 MC Emperor 可能是这个用例的一个很好的提示。
@MC Emperor 很好的提示。以上是关于如何在 lambda Java8 中抛出 Checked Exception? [复制]的主要内容,如果未能解决你的问题,请参考以下文章