我正在使用 Eclipse Luna 服务版本 2 (4.4.2),Java 8 u51。
我正在尝试创建一个方法,该方法将根据另一个方法参数创建传递对象的实例。原型(prototype)简化为
public <T> T test(Object param, T instance) {
Constructor<?> constructor = instance.getClass().getConstructors()[0]; // I actually choose a proper constructor
// eclipse reports "Unhandled exception type InvocationTargetException"
Function<Object, Object> createFun = constructor::newInstance;
T result = (T) createFun.apply(param);
return result;
}
在线用Function
声明eclipse报告Unhandled exception type InvocationTargetException
编译器错误。我需要 Function
稍后在流中使用。
我尝试添加各种 try/catch block 、抛出声明,但没有任何方法可以修复此编译器错误。
如何使这段代码工作?
最佳答案
您不能从具有 Function
目标类型的 lambda 中抛出检查异常,因为它的 apply
方法不会抛出异常。所以你需要把它变成一个未经检查的异常,例如通过包装它:
Function<Object, Object> createFun = o -> {
try {
return constructor.newInstance(o);
} catch (InstantiationException | InvocationTargetException | IllegalAccessException e) {
throw new RuntimeException(e);
}
};
另一种方法是让编译器认为这是一个未经检查的异常,与上面的选项相比,它会产生更清晰的堆栈跟踪:
Function<Object, Object> createFun = o -> {
try {
return constructor.newInstance(o);
} catch (InstantiationException | InvocationTargetException | IllegalAccessException e) {
return uncheck(e);
}
};
使用以下实用方法:
@SuppressWarnings("unchecked")
public static <E extends Throwable, T> T uncheck(Throwable t) throws E {
throw ((E) t);
}
关于来自模板化对象的 Java 8 功能构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31470817/