2013-03-22 79 views
0

我剛使卡片選擇動態,而不是5個if/elseif語句的序列。StackOverFlowException在For循環中未處理

Private Sub PlayElse() 
    Dim StartHeads As Integer 
    Dim CardCheckBoxArray() As CheckBox = {CardCheckBox1, CardCheckBox2, CardCheckBox3, CardCheckBox4, CardCheckBox5, CardCheckBox6, CardCheckBox7, CardCheckBox8, CardCheckBox9, _ 
              CardCheckBox10, CardCheckBox11, CardCheckBox12, CardCheckBox13, CardCheckBox14, CardCheckBox15, CardCheckBox16, CardCheckBox17, _ 
              CardCheckBox18, CardCheckBox19, CardCheckBox20, CardCheckBox21, CardCheckBox22, CardCheckBox23, CardCheckBox24, CardCheckBox25} 
    'Reset Number Generator 
    Number = (DeckGroup(Rnd.Next(0, DeckGroup.Count)).ID) 

    'card 1-5 
    For StartHeads = 0 To 4 
     If CardCheckBoxArray(StartHeads).Checked = True And DeckGroup(Number).QuantityInteger > 0 Then 
      'Grab New Card From Deck 
      DeckGroup(Number).QuantityInteger -= 1 
      Player1HandGroup(Number).QuantityInteger += 1 
      CardTypeArray(StartHeads) = Player1HandGroup(Number).CardType 
      CardCheckBoxArray(StartHeads).Text = Player1HandGroup(Number).CardNameString 
      NumberArray(StartHeads) = Number 
     Else 
      Call PlayElse() 
     End If 

這是我原來的代碼(注意,是一個結束。如果,我只是不想通過卡2-5重複代碼)

If CardCheckBox1.Checked = True And DeckGroup(Number).QuantityInteger > 0 Then 
    'Grab New Card From Deck 
    DeckGroup(Number).QuantityInteger -= 1 
    Player1HandGroup(Number).QuantityInteger += 1 
    CardTypeArray(0) = Player1HandGroup(Number).CardType 
    CardCheckBox1.Text = Player1HandGroup(Number).CardNameString 
    NumberArray(0) = Number 

沒有真正改變除,任何帶0的點不是由循環中的相應數字表示的。我在我的項目中有幾個類似於這個循環的循環,但不知怎的,這是一個獲得一個stackoverflow異常的循環。 CardCheckBoxArray中的CardCheckBoxes最多可達25個,因爲遊戲中有5名玩家。任何CardCheckBox在這個特定語句中的前6個都不會被訪問,因爲這個邏輯只代表了玩家1的卡。 (忘記提到的繼續按鈕時發生錯誤,突出Private Sub Playelse()導致子過程的頂部。)

+1

之前,您是否還有'在'Else'裏面調用PlayElse()'? – George 2013-03-22 18:12:25

回答

1

堆棧溢出異常的最常見原因就是這種情況,當你有一個自動調用次數過多的遞歸方法時。每次方法調用它時,它都會向堆棧中添加更多數據。在方法退出之前,數據不會從堆棧中刪除。例如,下面的方法是保證拋出StackOverFlowException

Public Sub Fail(count As Integer) 
    Fail(count + 1) 
End Sub 

正如你可以看到,當Fail方法,在我的例子是所謂的,它無限自稱一遍又一遍,從來沒有退出。因此,堆棧上的數據不斷增長,直到最終耗盡空間並拋出異常。

+0

在程序找到匹配的DeckGroup()。QuantityInteger> 0之前,沒有任何東西在積累。我理解你的子類,但是在執行失敗期間發生的所有事情都是startheads整數,cardcheck數組,聲明一個新的隨機數,然後它檢查玩家手牌中的牌1-5是否已經被填滿。至少這是我理解它的方式。有沒有辦法在沒有溢出的情況下生成相同的結果呢,同時保留代碼的動態特性? – 2013-03-22 18:26:56

0

Sub PlayElse遞歸地調用自身的情況下Else。您總是必須確保遞歸在某個時刻終止,否則最終會導致無限遞歸,導致堆棧溢出異常。

If條件說... And DeckGroup(Number).QuantityInteger > 0。如果是這種情況DeckGroup(Number).QuantityInteger遞減。在某一點它將爲零,並且將執行Else的情況,呼叫PlayElse這將再次執行Else的情況,因爲QuantityInteger現在爲零,以此類推。

Call PlayElse()應該在Then的情況下結束嗎?

+0

隨機數發生器每次重新啓動子程序時都會生成一個「新」隨機數。最終它會碰到deckgroup()中的一個項目,數量> 0,然後成功結束。這就是它如何從甲板上抓取特殊牌,並將其放入玩家手中。 – 2013-03-22 18:11:29

+1

這意味着隨機DeckGroup的數量會減少,但如果所有的數量都是'0',您仍然可以獲得無限遞歸。通過調試器中的方法,你會看到會發生什麼。 – 2013-03-22 18:18:33