Java覆盖compareTo与异常处理

时间:2016-04-26 05:44:45

标签: java override comparable

假设我有这门课程:

public abstract class GraphEdge implements Comparable {

    public abstract double getLength() throws DependencyFailureException;

    @Override
    public int compareTo(Object obj) {
        return Double.compare(getLength(), ((GraphEdge)obj).getLength());
    }
}

我们现在不用担心在compareTo中检查obj的类型。如果其依赖性失败,则getLength()抛出异常DependencyFailureException。由于getLength()抛出异常,因此在未处理DependencyFailureException时,compareTo会给出编译时错误。

我不知道try / catch是否是我在这里可以做的最好的事情,好像在getLength()中发生了异常,这意味着这个边缘的长度不再有意义并且将它与另一个double进行比较没有帮助。我认为如果getLength()发生异常,那么它应该只是通过呼叫的顶部来表示。

DependencyFailureException是一个自定义异常,如有必要,我可以更改。

我应该怎样做才能使GraphEdge具有可比性?

3 个答案:

答案 0 :(得分:2)

如上所述,您可以简单地将其包装在未经检查的异常中,这对您有用。

@Override
public int compareTo(Object o) {

    try {
        return getLength().compareTo(((GraphEdge)obj).getLength()));
    } catch (Exception e) {
        throw new RuntimeException(e.getMessage(), e);
    }
    return 0;
}

答案 1 :(得分:1)

使 DependencyFailureException 运行时异常或在try catch块中包围您的返回。

public class GraphEdge implements Comparable {

    public abstract double getLength() throws DependencyFailureException;

    @Override
    public int compareTo(Object obj) {
            try {
               return getLength().compareTo(((GraphEdge)obj).getLength()));
            } catch (RuntimeException ex) {
                 throw ex;
            } catch (DependencyFailureException ex) {
                 return -1; // or appropriate error value
            }
    }
}

答案 2 :(得分:0)

当您实现接口时(或者通常在重载方法时),您不允许:

      "declare any new checked exceptions for an implementation method".

因此,如果在无法测量长度的情况下发生异常并在compareTo方法中显式返回整数值,则必须定义策略。