在Java8流中处理CompressorException

时间:2018-08-19 11:50:15

标签: exception java-8 stream

我有一个读取.bz2文件的静态方法,它引发了检查的IOException和org.apache.commons.compress.compressors.CompressorException。函数签名为:

import timeit
import random

for i in range(10000,1000001,20000):
    t = timeit.Timer("del x[random.randrange(%d)]" % i, "from __main__ import random, x")
    x = list(range(i))
    lst_time = t.timeit(number=1000)
    x = {j:None for j in range(i)}
    d_time = t.timeit(number=1000)
    print("%d,%10.3f,%10.3f" % (i, lst_time, d_time))

尝试在Java8流中直接使用此方法会在Intellij中获得编译时错误;

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

因此,在听取here的建议之后,我尝试了以下操作,但始终坚持如何处理CompressorException对象。在ctor之后,我尝试了以下操作,但是Intellij仍然抱怨CompressorException未处理:

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

谢谢

1 个答案:

答案 0 :(得分:2)

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

您需要替换当前的实现:

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)