2013-03-22 82 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