包装方法抛出异常时出现编译错误
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;
}
包裹在流中抛出运行时异常的已检查异常在 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;
}