Java 用异常处理覆盖 compareTo

Java overriding compareTo with exception handling

假设我有这个 class:

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() 抛出异常,compareTo 给出编译时错误,因为 DependencyFailureException 未处理。

我不知道 try/catch 是否是我在这里能做的最好的事情,好像异常发生在 getLength() 中,这意味着这条边的长度不再有意义并且比较它到另一个双是没有帮助。我认为如果 getLength() 发生异常,它应该直接到达调用 hirachey 的顶部。

DependencyFailureException 是一个自定义异常,我可以根据需要进行更改。

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

使 DependencyFailureException 成为运行时异常或将您的 return 置于 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
            }
    }
}

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

@Override
public int compareTo(Object o) {

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

当你实现一个接口时(或者通常当你重载一个方法时)你不允许:

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

所以你必须定义一个策略,在无法测量长度的情况下发生异常时,并在compareTo方法中显式return一个整数值