For循环中的StackOverFlowException未处理

时间:2013-03-22 17:53:08

标签: vb.net exception stack-overflow

我刚刚选择了Card Selection Dynamic,而不是5 if / elseif语句的序列。

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

这是我的原始代码(注意有一个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中的CardCheckBox最多可达25,因为游戏中有5名玩家。由于此逻辑仅代表玩家1的牌,因此不会访问此特定语句中任何超过6的CardCheckBox。 (忘记提及继续按钮会在发生错误时指向子过程的顶部,突出显示Private Sub Playelse()。)

2 个答案:

答案 0 :(得分:1)

堆栈溢出异常的最常见原因,就像这里的情况一样,当你有一个自我调用太多次的递归方法时。每次方法调用自身时,它都会向堆栈添加更多数据。在方法退出之前,不会从堆栈中删除数据。例如,保证以下方法抛出StackOverFlowException

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

正如您所看到的,当我调用我的示例中的Fail方法时,它会一遍又一遍无限地调用自身,从不退出。因此,堆栈上的数据不断增长,直到最终耗尽空间并抛出异常。

答案 1 :(得分:0)

Sub PlayElseElse案例中以递归方式调用自身。你总是必须确保递归在某个时刻终止,否则最终会导致无限递归,从而引发堆栈溢出异常。

If条件显示... And DeckGroup(Number).QuantityInteger > 0。如果是这种情况,则DeckGroup(Number).QuantityInteger递减。在某些时候,它将为零并且Else案例将被执行,调用PlayElse将再次执行Else案例,因为QuantityInteger现在为零,依此类推。

Call PlayElse()案例的结尾应该Then吗?