处理Java中重写接口中的异常

时间:2017-07-08 17:00:25

标签: java generics exception-handling

我正在实现一个Java接口(来自JGraphT的EdgeProvider),并且不允许null。但是,我在重写方法中实例化泛型类型,并且无法以我能够检测到并干净地突破的方式找出如何处理InstantiationExceptionIllegalAccessException执行流程。

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;
        }
      }
    };

如果我重新抛出,我会收到一条警告,说明我有未处理的例外情况。有什么建议吗?

4 个答案:

答案 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并在调用方法中处理异常。