我正在使用
Eclipse Luna Service Release 2(4.4.2),Java 8 u51.
我正在尝试创建一个方法,该方法将基于另一个方法参数创建传递对象的实例.原型简化为
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; }
与函数声明一致的eclipse报告未处理的异常类型InvocationTargetException编译器错误.我需要函数以后在流中使用.
我试图添加各种try / catch块,抛出声明,但没有修复此编译器错误.
如何使这段代码工作?
解决方法
您不能从具有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); }