2016-04-26 113 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方法中的整數值。