代码之家  ›  专栏  ›  技术社区  ›  user3407267

如何在lambda Java8中抛出Checked异常?[重复]

  •  -1
  • user3407267  · 技术社区  · 8 年前

    我试图在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 回复  |  直到 8 年前
        1
  •  2
  •   davidxxx    8 年前

    在中使用的功能接口 getValue() 没有具体说明 IOException 选中此签名中的异常。
    因此不能抛出它,因为只有声明的已检查异常可以在lambda主体内抛出。
    创建并使用自己的函数接口 IOException 或者扔掉任何 RuntimeException 实例,这是有效的。
    例如 UncheckedIOException 正如MC皇帝建议的那样。

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

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