被包装为在流中引发运行时异常的经检查异常在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);
}
}
预期:没有编译错误,也没有输出。 实际:编译错误,未处理的异常。
答案 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;
}