如何使用java8 lambda表达式抛出自定义检查的异常?

时间:2015-05-11 09:43:44

标签: java java-8

我有以下代码。

 <div class="form-group">
        <select name="jenis_kelamin" class="form-control">
            <option value="0" selected="selected" disabled="disabled">--Gender--</option>
            <option value="1">Male</option>
            <option value="2">Female</option>
            <option value="3">Don't know</option>
        </select>
    </div>

这里我的private static void readStreamWithjava8() { Stream<String> lines = null; try { lines = Files.lines(Paths.get("b.txt"), StandardCharsets.UTF_8); lines.forEachOrdered(line -> process(line)); } catch (IOException e) { e.printStackTrace(); } finally { if (lines != null) { lines.close(); } } } private static void process(String line) throws MyException { // Some process here throws the MyException } 方法抛出已检查的异常,并且我在lambda中调用该方法。此时需要从process(String line)方法抛出MyException而不抛出readStreamWithjava8()

如何使用java8执行此操作?

1 个答案:

答案 0 :(得分:5)

简短的回答是,你不能。这是因为forEachOrdered需要Consumer,并且未声明Consumer.accept会抛出任何异常。

解决方法是执行类似

的操作
List<MyException> caughtExceptions = new ArrayList<>();

lines.forEachOrdered(line -> {
    try {
        process(line);
    } catch (MyException e) {
        caughtExceptions.add(e);
    }
});

if (caughtExceptions.size() > 0) {
    throw caughtExceptions.get(0);
}

但是,在这些情况下,我通常会在process方法中处理异常,或者使用for-loops以旧式方式处理异常。