当前位置: 首页 > 知识库问答 >
问题:

如何在lambda Java8中抛出检查异常?[副本]

景稳
2023-03-14

我试图在lambda内部抛出一个异常,但它总是给我一个错误,表示未处理的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());
                }
        });
}

有人能告诉我我做错了什么吗?

共有1个答案

韦阳晖
2023-03-14

您在GetValue()中使用的函数接口没有指定此签名中的IOException检查异常。
因此您不能抛出它,因为只有声明的检查异常才可能抛出在lambda主体中。
或者创建并使用声明IOException的自己的函数接口,或者从lambda抛出任何有效的RuntimeException实例。
例如MC皇帝建议的UncheckedIoException

此外,您应该通过将新异常链接到原因异常来抛出它,以将信息保留在StrackTrace中:

try {
    return mapper.readValue(reader, responseClass);
} catch (IOException e) {
    throw new UncheckedIOException("Exception while deserializing the output ", e);
}
 类似资料:
  • 如何从Java 8流/lambda内部抛出检查异常? 换句话说,我想让像这样的代码编译: 此代码未编译,因为上面的方法抛出了,而该方法已被选中。 请注意,我不想在运行时异常中包装已检查的异常,而抛出包装的未检查的异常。我想抛出检查的异常本身,并且不向流中添加丑陋的/。

  • 假设我想在收到特定异常时恢复某个值,否则返回失败的未来。我希望是这样的: 如果函数会抛出检查过的异常,我想在链式方法中处理它。我尝试过和,但都无法编译。是否为这种情况提供了任何解决方案?我知道接口是方法的参数,它不会抛出任何异常——在这种情况下,我只想返回已经失败的未来。我想找到使用Java8的解决方案。

  • 我怎样才能用Java8做到这一点呢?

  • 问题内容: 包含多个有关将检查的异常与混合使用的问题。 虽然一些答案暗示使用其方法会导致难以阅读的用户代码。 我将使用此空间来提供可提高可读性的替代解决方案。 请注意,此问题特定于CompletableFuture。 这使我们能够提供更广泛地不扩展到lambda表达式的解决方案。 问题答案: 给定实用程序类(下面提供),用户可以无缝地抛出检查异常: 由lambda引发的任何异常(是否经过检查)都将

  • 在你可以捕获异常之前,一些代码必须抛出一个异常。任何代码都可能会抛出异常:您的代码,来自其他人编写的包(例如Java平台附带的包)或Java运行时环境的代码。无论是什么引发的异常,它总是通过 throw 语句抛出。 您可能已经注意到,Java平台提供了许多异常类。所有类都是Throwable类的后代,并且都允许程序区分在程序执行期间可能发生的各种类型的异常。 您还可以创建自己的异常类来表示在您编写

  • 如何在Lambda中处理和重新抛出异常?当我试图用try/catch块包围调用时,它只是在lambda表达式中捕获它。我在方法签名中有ServiceException,所以我只想重新抛出它。是可能还是我漏掉了什么?