包装方法抛出异常时出现编译错误

Compilation error while wrapping method throwing exception

包裹在流中抛出运行时异常的已检查异常在 JDK 11 和 12 中因编译错误而失败。

package com.mmk.test;

import java.net.URL;
import java.util.ArrayList;
import java.util.function.Function;

public class App {
    public static void main(String[] args) {
        var list = new ArrayList<String>();
        list.add("http://foo.com");
        list.stream().map(wrap(url -> new URL(url)));
    }

    static <T, R, E extends Throwable> Function<T, R>
    wrap(FunException<T, R, E> fn) {
        return t -> {
            try {
            return fn.apply(t);
            } catch (Throwable throwable) {
                throw new RuntimeException(throwable);
            }
        };
    }

    interface FunException<T, R, E extends Throwable> {
        R apply(T t);
    }
}

预期:没有编译错误,也没有输出。 实际:编译错误,未处理的异常。

FunException::apply方法没有声明任何要抛出的异常,所以当你创建一个可以抛出异常的lambda时

url -> new URL(url)

编译器抱怨你没有处理这个异常,而且 FunException::apply 也没有在它的 throws 子句中声明它。

您可以通过添加 throws 子句使其工作,即:

interface FunException<T, R, E extends Throwable> {
    R apply(T t) throws E;
}