2013-02-07 73 views
0

感謝您檢查我的問題。我有以下代碼爲java甲板。我想擺脫數組和玩具代碼,並嘗試使用最佳實踐和麪向對象的原則,我知道我可以用更簡單但更少重用的方式來實現這一點。如何處理返回對象和處理錯誤

最終目標是創建一個cardgame框架,我可以用它來處理甲板管理的世俗部分,同時專注於不同遊戲的實現。

我遇到了錯誤處理問題。我對draw()代碼的想法如下 -

1)如果有另一張牌返回它並移動迭代器。這將消除丟棄堆的需要,因爲拋棄者將在iterator後面,而.last()卡就是剛纔繪製的那個。 2)如果沒有另一個卡,「卡」是空的,則運行emptyDeck()方法。這個方法將在子類中實現。例如在單人紙牌遊戲中,您可能希望在經過甲板x次後結束遊戲,因此您可能不想再抽一張紙牌。 3)如果套牌不是空的,你沒有更多的卡,那麼你可以調用將被分類的endOfDeck()方法。再次,你可能想洗牌或重置迭代器

但是我得到舊的「必須返回卡」錯誤消息。我試過創建一個自定義異常,但我只能指定一個處理程序方法。任何人都可以提出一個聰明的方法來做到這一點?

public abstract class Deck 
{ 

private ArrayList<Card> cards; 
private ListIterator<Card> deckPosition = cards.listIterator(); 
/** 
* 
*/ 
public Deck() 
{ 
} 

public Card draw() 
{ 
    Card drawn; 

    try 
    { 
     if(deckPosition.hasNext()) 
     { 
      drawn = deckPosition.next(); 
     } 
     else if(cards.isEmpty()) 
     { 
      emptyDeck(); 
     } 
     else 
     { 
      endOfDeck(); 
     } 
    } 

    catch(Exception e) 
    { 
     System.out.println("Exception when drawing a card, check try/catch block in draw() method of Deck"); 
     e.printStackTrace(); 
    } 

    finally 
    { 
     return drawn; 
    } 
} 

public abstract void endOfDeck(); 
public abstract void emptyDeck(); 

} 

回答

3

當一個方法無法有意義的結果返回由於內部錯誤,該方法應該拋出返回只是一些的異常,而不是。所以,當你的繪圖方法本身無法管理的錯誤發生時,它應該拋出一個異常本身,然後由調用者處理。

在這種情況下,我會創建一個新的異常類DeckEmptyException。當牌組爲空時,draw方法將拋出該異常而不是返回一張牌。無論誰調用抽籤方法,都必須處理這個例外。

+0

+1 - 遠遠好於返回'null',這通常只會在返回後導致java.lang.NullPointerException。 –

+0

您也可以獲得我的投票! – BobTheBuilder

+0

雖然我會如何處理多個漁獲物?正如我提到的我嘗試使用自定義異常,但是我想處理DeckEmptyException和EndOfDeckException(我仍然可以使用它來重新洗牌或重置迭代器)。另外,它不是內部錯誤,而是狀態可能存在,我想測試和處理。也許我應該把它分解成其他方法,但我希望有一個聰明,乾淨的方式來處理它 – SMC