假设我有这门课程:
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具有可比性?
答案 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方法中显式返回整数值,则必须定义策略。