如何在lambdajava8中抛出选中的异常?

如何在lambdajava8中抛出选中的异常?,java,exception,lambda,java-8,checked-exceptions,Java,Exception,Lambda,Java 8,Checked Exceptions,我试图在lambda中抛出一个异常,但它一直给我一个错误,表示未处理的IOException private <T> T getResponse(final RestURI query, final Class<T> responseClass) throws IOException { return getValue(query, reader -> { try {

我试图在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());
                }
        });
}
private T getResponse(最终RestURI查询,最终类responseClass)抛出IOException{
返回getValue(查询,
读者->{
试一试{
返回mapper.readValue(reader,responseClass);
}捕获(IOE异常){
抛出新IOException(“反序列化输出时异常”+e.getMessage());
}
});
}

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

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

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

try {
    return mapper.readValue(reader, responseClass);
} catch (IOException e) {
    throw new UncheckedIOException("Exception while deserializing the output ", e);
}

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

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

try {
    return mapper.readValue(reader, responseClass);
} catch (IOException e) {
    throw new UncheckedIOException("Exception while deserializing the output ", e);
}

在任何情况下,都不要这样重试:提供
e
作为新异常的原因(如果您确实需要),以便提供实际异常的堆栈跟踪。在任何情况下,都不要这样重试:提供
e
作为新异常的原因(如果您确实需要),为了提供实际异常的堆栈跟踪。或者抛出一个
UncheckedIOException
。答案很好,但是初级开发人员最好不要默认到处抛出
RuntimeException
,因为它缺乏清晰性。在本例中,您应该扩展RuntimeException并将其称为类似于
JsonParseException
@如果您不想创建自己的类,McEmperon还提供了一个优雅的解决方案。但是,我更喜欢特定于域的类。@Brad完全同意键入。但是
JsonParseException
已经存在于Jackson中。事实上,OP希望重新抛出由
ObjectMapper.readValue()
引发的任何异常,这些异常实际上抛出了多种风格的
IOException
:`IOException,JsonParseException,JsonMappingException`。因此,对于这个用例,MC-emperon可能是一个很好的提示。@MC-emperon非常好的提示。或者抛出一个
UncheckedIOException
。这是一个很好的答案,但是初级开发人员最好不要默认到处抛出
RuntimeException
,因为它缺乏清晰性。在本例中,您应该扩展RuntimeException并将其称为类似于
JsonParseException
@如果您不想创建自己的类,McEmperon还提供了一个优雅的解决方案。但是,我更喜欢特定于域的类。@Brad完全同意键入。但是
JsonParseException
已经存在于Jackson中。事实上,OP希望重新抛出由
ObjectMapper.readValue()
引发的任何异常,这些异常实际上抛出了多种风格的
IOException
:`IOException,JsonParseException,JsonMappingException`。所以MC皇帝可能是这个用例的一个很好的提示。@MC皇帝非常好的提示。