包装方法引发异常时发生编译错误

时间:2019-06-23 12:57:32

标签: java java-11

被包装为在流中引发运行时异常的经检查异常在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);
    }
}

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

1 个答案:

答案 0 :(得分:2)

FunException::apply方法不会声明要引发的任何异常,因此,当您创建可以引发异常的lambda时

url -> new URL(url)

编译器会抱怨,因为您未处理此异常,并且FunException::apply也未在其throws子句中声明它。

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

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