2011-11-04 45 views
0

我正在爲點和向量寫一個類。我想用它們來計算向量的點和範數。 這些是點和矢量類在java中從不發生的異常

public class Point { 
    public float x,y; 
} 
public class MyVector { 
     public Point start,end; 
} 

我寫這些代碼點計算點。

public float dot(MyVector v) throws Exception 
{ 
    if((start.x != v.start.x) || (start.y != v.start.y)) 
     throw new Exception("Vectors not begin in same Point"); 
} 

我想用這個函數來計算向量的範數。

public float norm() 
{ 
     return dot(this); 
} 

我知道規範函數從不會出現異常情況。所以我不會拋出 異常。我知道我可以像波紋管那樣做:

public float norm() 
{ 
    try 
    { 
     return dot(this); 
    } 
    catch(Exception e) 
    { 

    } 
} 

但我認爲這是多餘的。有沒有一種方法可以去除規範函數中的try和catch?

+4

拋出一些擴展了RuntimeException的東西 - 您不需要嘗試/捕獲未經檢查的異常。 (請參閱http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html) – BobG

回答

4

這個意圖不能用java表達。無論函數點是否拋出異常。

你不能給它一個「提示」來指定有條件的情況,即絕不會拋出異常。

您可以選擇這種情況,也可以切換爲僅使用RuntimeException。

或者你可以將它重構爲這樣的事情

public float dot(MyVector v) throws Exception 
{ 
    if((start.x != v.start.x) || (start.y != v.start.y)) 
     throw new Exception("Vectors not begin in same Point"); 

    return unchecked_dot(MyVector v) 
} 

其中unchecked_dot執行實際操作,但不檢查參數,並沒有聲明拋出異常。

public float norm() 
{ 
    return uncheked_dot(this); 
} 
2

在java語言中沒有辦法。

處理此問題的最佳方法是使用評論和重新排序。

例如,如果您使用的是write方法,它接受一個Appendable但不得傳遞StringBuilder那麼也許你想掩蓋的是Appendable.append拋出IOException因爲StringBuilder其實從來不這樣一個事實。

try { 
    write(myStringBuilder); 
    } catch (IOException ex) { 
    // Should never happen since StringBuilders do 
    // not throw IOexceptions on append. 
    throw new AssertionError(ex); 
    } 

請注意,如果你錯了(現在或將來)關於委託函數的拋出,然後在AssertionError重新拋出的能力,你給代碼維護者有關什麼地方出了錯更多信息。

如果您的項目始終如一地使用日誌記錄系統,那麼如果記錄和刪除異常不會違反任何不變量,則日誌記錄可以是一個不錯的選項。

1

如果你有理由相信點(...)應該拋出異常,也可能是規範(...)。吃掉異常並不是一個好主意。但是,是的,如果你確實想要,你必須寫一個嘗試。唯一的另一種選擇是你可以從點(...)拋出RuntimeException,在這種情況下你不需要捕獲。

+0

不是,在這種情況下,dot()會拋出類似非法參數異常的內容。然而,norm()並不是這樣,它沒有任何參數。 – Krab

+0

@Krab,這是一個非常有效的點! – aishwarya

1

不要拋出一個普通的例外。

創建RuntimeException的一個子類並使其更容易捕獲上游 - 將其命名爲「DotUndefinedException」。

當您使用運行時異常來執行此操作時,您不必指定它,除非您明確要處理它。