在 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 回答
慕尼黑的夜晚无繁华
TA贡献1864条经验 获得超6个赞
该FunException::apply
方法没有声明任何要抛出的异常,因此当您创建一个可以抛出异常的 lambda 时
url -> new URL(url)
编译器会抱怨,因为你没有处理这个异常,也FunException::apply
没有在它的throws
子句中声明它。
您可以通过添加一个子句使其工作throws
,即:
interface FunException<T, R, E extends Throwable> { R apply(T t) throws E; }
添加回答
举报
0/150
提交
取消