为什么我用下面的代码编译不成功?

why I can't compile successfully with the following code?

public class PoiSheetUtil{
    public Workbook mergeExcelFiles(Workbook book, Map<Integer,InputStream> inMap) throws IOException, 
    InvalidFormatException{
        inMap.forEach((k,v)->{
            Workbook b = WorkbookFactory.create(v);
           //omit copy sheet method
            copySheets(book.createSheet(),b.getSheetAt(k));
        });
        return book;
    }
}

我在第 5 行收到一个错误,显示“未处理的异常 IOException,InvalidFormatException”

这里的问题是上下文;可能引发异常的代码位于 lambda 中:

inMap.forEach((k,v)->{
    Workbook b = WorkbookFactory.create(v);
    ...
});

在这种情况下,lambda 表达式无法正确处理异常。尝试

inMap.forEach((k,v)->{
    try {
        Workbook b = WorkbookFactory.create(v);
        ...
     } catch (IOException | InvalidFormatException exc) {
         throw new RuntimeException(exc);
     }
  });

或使用其他类型的迭代构造(例如,基于迭代器的 for 语句)可以透明地传播异常:

for (var entry: inMap.entrySet()) {
     final var k = entry.getKey();
     final var v = entry.getValue();
     ...
}