【问题标题】:Handling CompressorException in Java8 Streams在 Java 8 Streams 中处理 Compressor 异常
【发布时间】:2018-08-19 11:50:15
【问题描述】:

我有一个读取 .bz2 文件的静态方法,它会抛出检查过的 IOException 和 org.apache.commons.compress.compressors.CompressorException。函数签名是:

private static MyClass readFile(String fileName) throws IOException, CompressorException{
//…
}

尝试对 Java8 流直接使用此方法会导致 Intellij 中出现编译时错误;

unhandled exceptions: java.io.IOException, org.apache.commons.compress.compressors.CompressorException

因此,根据here 等人的建议,我尝试了以下方法,但一直停留在如何处理 CompressorException 对象上。紧随其后的是ctor,我已经尝试如下,但 Intellij 仍然抱怨 CompressorException 未处理:

files.stream().forEach(i -> {
    try{
        readFile(i);
    } catch (IOException e){
        throw new RuntimeException(e);
    } catch (Throwable ex){
        throw new CompressorException("compressorException", ex);//error!!!
    }
});

谢谢

【问题讨论】:

  • 好吧,不是像处理 IOException 那样捕获它,而是抛出它。不。像处理 IOException 一样捕获它。

标签: exception java-8 stream


【解决方案1】:

正如评论中提到的@JB Nizet,您不能从foreach 函数内的lambda 函数中抛出任何Exception

您需要替换当前的实现:

catch (Throwable ex){
        throw new CompressorException("compressorException", ex);//error!!!
}

到以下内容或根本不抛出RuntimeException

catch (Throwable ex){
        throw new RuntimeException("compressorException", ex);
}

上述行为的原因是Stream.foreach()方法具有以下签名,并且作为签名的一部分没有抛出任何异常。

void forEachOrdered(Consumer<? super T> action)

【讨论】:

    猜你喜欢
    • 2018-04-29
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多