2013-10-15 69 views
0

我有一個類,Line,它需要兩個點,作爲向量給出,作爲參數,並模擬在它們之間傳遞的無限長線。第二個類別BoundedLine需要兩個點並對連接它們的有限線進行建模。如何訪問try塊內的參數?

如果兩點相同,則表示BoundedLine中超級構造函數的調用需要包含在try catch塊中,否則Line會引發異常。不幸的是,這些參數似乎在try塊內不可用;我將如何訪問它們?

// Constructor in Line 
public Line (Vector start, Vector end) throws Exception { 

    if (start.equals (end)) { 
     throw new Exception ("Points are the same"); 
    } 

    else { 

     this.start = start; 
     this.end = end; 

     modelLine (start, end);    
    }   
} 

// Constructor in BoundedLine 
public BoundedLine (Vector start, Vector end) throws Exception { 

    try { 
     super (start, end); 
    } 
    catch (Exception e) { 
     throw e; 
    } 

    applyBoundaries (start, end);   
} 

我得到的一個編譯時錯誤: 「類線構造線不能被應用到給定的類型; 要求:向量,向量;實測值:無參數;原因:實際的和正式的參數列表長度不同「。

如果我刪除異常和try/catch塊,那麼代碼工作正常。

回答

2

如果您聲明您的BoundedLine構造函數throws Exception無需趕上

在任何情況下,對子類構造函數中的超類構造函數的調用必須是第一行

試試這個:

public BoundedLine (Vector start, Vector end) throws Exception { 
    super (start, end); 
    applyBoundaries (start, end);   
} 

我還想補充一點,扔Exception是一大禁忌,你應該拋出一個特定的異常。您可以使用JDK中已有的未經檢查的IllegalArgumentException。如果你想要一個檢查的異常,我會建議你創建自己的。

public Line (final Vector start, final Vector end) { 
    if (start.equals (end)) { 
     throw new IllegalArgumentException("Points are the same"); 
    } 
    this.start = start; 
    this.end = end; 
    modelLine (start, end);      
} 

而且使用的是Vector這是

  1. 一個rawtype - 請閱讀Generics
  2. 一個廢棄的集合類型,使用List。請閱讀有關Collections
+0

謝謝你。我實際上使用Vector作爲我自己的類來模擬數學矢量 - 我沒有意識到這是另一個類。 – Emma

1

爲什麼你抓到異常並再次拋出?只要刪除try catch塊。

1

你用BoundedLine(你可以刪除try和catch塊),如果出現任何異常,最終會被採摘拋出statement..and那麼你可以說趕上,你調用異常功能。

希望它有用。

1

如果超級調用失敗,對象未正確創建。這會導致整個對象在理論上未定義(如果i.E.內存不足),因此這在Java中是不允許的。

1

Emma,作爲例外聲明構造函數調用必須是構造函數中的第一個語句,這意味着基礎構造函數將在第一行調用,並且在基礎構造函數之前不能放置其他語句。

爲什麼這種行爲,有趣的是,要知道,你的例子也說明了爲什麼沒有這樣的語句可以繼續在基類構造函數。

在你的例子中,如果你能夠在super之前放置try語句,那麼你會發現異常並且什麼都不做,BoundedLine的對象會被創建,但因爲我們知道異常是從基類構造函數因此,所有的屬性,基本對象的值尚未創建由此派生類的對象也應該不會被初始化..
希望這解釋了爲什麼沒有線路或代碼可以繼續在基類construtors的原因。沒有規定明確的構造

1

所有的Java對象都有一個隱含的無參數的構造函數是所有子類的構造函數之前調用。

問題是,由於對超級構造函數的調用不是子類構造函數中的第一條語句,因此JVM試圖調用超類的默認無參數構造函數,我在超類中創建了另一個構造函數。

做最簡單的事情,因爲其他人所說,是消除在try-catch - 這不是你買任何東西,如果你只是重新拋出異常。

+0

正如你所說的「JVM試圖調用超類的缺省無參構造函數」,但是如果我有一個沒有參數的缺省構造函數,那麼JVM也不允許我這樣做。 – dbw

+0

如果我理解正確,可以重寫默認構造函數,也可以使用super()從子類構造函數中調用超類的默認構造函數。 –