如何在lambda Java8中引发Checked Exception?

时间:2018-08-24 19:57:32

标签: 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 {
                    return mapper.readValue(reader, responseClass);
                } catch (IOException e) {
                    throw new IOException("Exception while deserializing the output " + e.getMessage());
                }
        });
}

有人可以告诉我我在做什么错吗?

1 个答案:

答案 0 :(得分:2)

您在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);
}