我正在实现一个Java接口(来自JGraphT的EdgeProvider),并且不允许null
。但是,我在重写方法中实例化泛型类型,并且无法以我能够检测到并干净地突破的方式找出如何处理InstantiationException
或IllegalAccessException
执行流程。
EdgeProvider<V, E> ep = new EdgeProvider<V, E>() {
@Override
public E buildEdge(V from, V to, String label, Map<String, String> attributes) {
try {
return eClass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
return null;
}
}
};
如果我重新抛出,我会收到一条警告,说明我有未处理的例外情况。有什么建议吗?
答案 0 :(得分:2)
您可以抛出RuntimeException
,因为只有经检查的异常无法添加到覆盖方法的声明中。
您可以定义一个自定义异常(RuntimeException
的子类):MyBuildEdgeException
包装捕获的异常。
public class MyBuildEdgeException extends RuntimeException{
public MyBuildEdgeException(Exception cause){
super(cause);
}
}
现在你可以用这种方式抛出异常:
EdgeProvider<V, E> ep = new EdgeProvider<V, E>() {
@Override
public E buildEdge(V from, V to, String label, Map<String, String> attributes) throws MyBuildEdgeException{
try {
return eClass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new MyBuildEdgeException(e);
}
}
};
答案 1 :(得分:1)
有一种方法可以使用构造函数引用来实例化没有异常的类。例如:
Supplier<SomeType> eCons = SomeType::new;
Supplier
用于默认构造函数,但您可以使用与要引用的构造函数的签名匹配的任何函数接口类型(例如,此处列出的那些之一:Link) (例如一个带参数的人)。
如果是Supplier
,您可以致电get()
,以创建新实例:
EdgeProvider<V, E> ep = new EdgeProvider<V, E>() {
@Override
public E buildEdge(V from, V to, String label, Map<String, String> attributes) {
return eCons.get();
}
};
答案 2 :(得分:0)
除非您特别希望它们是例外,例如因为它们可能是配置问题等,我认为它们是构建/安装错误。
所以我通常只需转身并将它们重新抛出为Error
,就像你直接调用构造函数/方法时所发生的那样,而不是使用反射:
try {
// code
} catch (InstantiationException e) {
throw new InstantiationError(e.getMessage());
} catch (IllegalAccessException e) {
throw new IllegalAccessError(e.getMessage());
}
答案 3 :(得分:0)
你需要在buildEdge方法中添加throws子句,如果不处理它就像没有需要try / catch那样返回null并在调用方法中处理异常。