gpt4 book ai didi

java - 为什么在stream.forEach()中触发未处理的异常,但在正常的for循环中却没有触发

转载 作者:行者123 更新时间:2023-12-01 20:03:02 25 4
gpt4 key购买 nike

未处理的IOException在以下代码中触发:

ZipOutputStream zos = new ZipOutputStream(outputStream);
testIds.stream().forEach(testId->{
zos.putNextEntry(new ZipEntry(testId + "_" + (Calendar.getInstance().getTimeInMillis() / 1000) + ".pdf"));
zos.write(files.get(testId));
zos.closeEntry();
});

但以下代码的情况并非如此:

ZipOutputStream zos = new ZipOutputStream(new ByteArrayOutputStream());    
for (Integer testId : testIds) {
zos.putNextEntry(new ZipEntry(testId + "_" + (Calendar.getInstance().getTimeInMillis() / 1000) + ".pdf"));
zos.write(files.get(testId));
zos.closeEntry();
}

最佳答案

这是因为 .forEach() 中使用的接口(interface)方法签名(准确地说是 Consumer)没有声明抛出异常。

签名如下所示:

public interface Consumer<T> {
void accept(T t); // <-- no throws declaration
}

正因为如此。 Java 禁止抛出受检查异常。

在第二个代码片段中,您可能有一个带有 throws 声明的方法,如下所示:

 public void method() throws IOException{ // <-- throws declaration here
ZipOutputStream zos = new ZipOutputStream(new ByteArrayOutputStream());
for (Integer testId : testIds) {
zos.putNextEntry(new ZipEntry(testId + "_" + (Calendar.getInstance().getTimeInMillis() / 1000) + ".pdf"));
zos.write(files.get(testId));
zos.closeEntry();
}
}

这就是为什么您没有收到类似错误的原因。

解决此错误的一种方法是在 .forEach() 中使用 try catch,然后捕获异常,但这只会使 lambda 膨胀。我建议您保留代码并仅使用迭代 for-each 循环

关于java - 为什么在stream.forEach()中触发未处理的异常,但在正常的for循环中却没有触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47815683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com