我试图在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());
}
});
}
有人能告诉我我做错了什么吗?
您在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,所以我只想重新抛出它。是可能还是我漏掉了什么?