【问题标题】:How to throw Checked Exception inside lambda Java8? [duplicate]如何在 lambda Java8 中抛出 Checked Exception? [复制]
【发布时间】: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作为新异常的原因(如果你真的需要的话),以便提供实际的堆栈跟踪例外。

标签: java exception lambda java-8 checked-exceptions


【解决方案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 很好的提示。
猜你喜欢
  • 2015-07-21
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多