2016-04-26 117 views
4

假设我有这个类:的Java覆盖的compareTo与异常处理

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()中发生异常一样,这意味着此边的长度不再有意义,并将它与另一个双重没有帮助。我认为如果发生异常从getLength()发生,它应该只是表面上调用hirachey的顶部。

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

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

+0

如果你正在使用泛型,你不需要介意'obj'的类型。 – SomeJavaGuy

+0

@KevinEsche的确如此。这不是我关心的问题,因为我的主要问题是异常处理。 – jamesdeath123

+0

你也有多个编译时错误。您不能在非抽象类中定义抽象方法。你不能在基元上调用'compareTo'。 – SomeJavaGuy

回答

2

如上所述,您可以简单地将它包装在Unchecked异常中,这对您有用。

@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

生成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 
      } 
    } 
} 
+3

请注意,这打破了“可比”合同。在这里需要注意保持一致。 –

+1

try/catch似乎是个好主意。但是,如果getLength()获得异常,我认为我应该停止整个过程并将异常抛出到调用hirachey的顶部。这是否是一种方式? – jamesdeath123

+1

我觉得更好的选择是将'DependencyFailureException'封装到'IllegalArgumentException'中,并将其从'compareTo'方法中抛出。 – Codebender

0

当你实现一个接口(或通常当你重载的方法),你不准:

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

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