4

我有一个删除一些文件的方法:

void deepDelete(Path root) {
    Files.walk(root)
            .filter(p -> !Files.isDirectory(p))
            .forEach(p -> { try { Files.delete(p); }
                            catch (IOException e) { /* LOG */ }
            });
}

try/catch 块降低了操作的可读性,尤其是与使用方法引用相比:

void deepDelete(Path root) throws IOException {
    Files.walk(root)
            .filter(p -> !Files.isDirectory(p))
            .forEach(Files::delete); //does not compile
}

不幸的是,该代码无法编译。

有没有办法应用在终端操作中引发检查异常并简单地“重新引发”任何异常的操作?

我知道我可以编写一个包装器,将检查的异常转换为未经检查的异常,但如果可能的话,我宁愿坚持使用 JDK 中的方法。

4

2 回答 2

1

据我所知:没有。我使用这篇 techempower 文章作为我的 java8 指南,它非常明确(参见标题为“异常透明度”的部分)。

于 2014-02-11T00:28:06.370 回答
0

如果您声明此方法:

@SuppressWarnings("unchecked")
static <T extends Throwable> RuntimeException sneakyThrow(Throwable t) throws T {
    throw (T)t;
}

然后你可以这样做:

try {
    Files.delete(p);
} catch (IOException e) {
    throw sneakyThrow(e);
}

这绕过了检查的异常规则并在不包装的情况下抛出原始IOException数据,尽管您仍然必须捕获它并重新抛出。我并不是说这是一个好主意,但这是一个主意。

于 2014-07-30T23:41:19.767 回答