如何在 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? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

并发.futures.ThreadPoolExecutor的使用总是在aws lambda中抛出超时异常

Java8--Lambda表达式

Java8部分新特性的学习

Java8部分新特性的学习

在 Java8 中使用 lambda 仅在不为空时过滤值

如何在扩展中抛出异常?