函数调用自身,无法避免StackOverflow错误

时间:2011-10-07 14:29:15

标签: vb.net visual-studio exception stack-overflow

我知道这是糟糕的编程习惯和冗余编码,但我很好奇。

我只是在一个while循环中计算一个高达9999999的数字。 Add()函数只会增加该数字并将其打印出来。

Add()函数内部,我调用Add()函数。

我的程序在获得StackOverflow异常之前成功打印出12000个数字。

所以我的问题=有没有办法忽略这个错误并继续计数?

我尝试了On Error ResumeTry/Catchthrow

我的代码如下。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    While number1 < 9999999
        Try
            add()
        Catch ex As StackOverflowException
            ''Do Stuff here
        End Try
    End While
End Sub


  Function add()
    number1 = number1 + 1
    Trace.WriteLine(number1) ''Error is throw here
    add()
    Return number1
End Function

4 个答案:

答案 0 :(得分:4)

  

有没有办法忽略这个错误

没有。你唯一能做的就是避免首先造成它。大多数情况下,StackOverflowExceptions无法捕获。来自MDSN

  

从.NET Framework 2.0版开始,try-catch块无法捕获StackOverflowException对象,默认情况下会终止相应的进程。

答案 1 :(得分:3)

由于VB.NET不支持tail recursion,因此无法在不最终溢出堆栈的情况下进行无限递归。

答案 2 :(得分:1)

你永远不会从函数返回:

Function add()
    number1 = number1 + 1
    Trace.WriteLine(number1)
    add()
    Return number1
End Function

因此,add调用add调用add - 在某些时候你正在吹嘘堆栈。你需要某种退出条件来测试。

例如:

Function add()
    number1 = number1 + 1
    Trace.WriteLine(number1)

    If number1 < 99999999 Then
      add()
    Else
      Return number1
    End If
End Function

答案 3 :(得分:0)

从此处更改您的方法:

Function add()     
    number1 = number1 + 1     
    Trace.WriteLine(number1) ''Error is throw here     
    add()     
    Return number1 
End Function 

对此:

Function add()     
    number1 = number1 + 1     
    Trace.WriteLine(number1) ''Error is throw here     
    Return number1 
End Function 

保持其余代码相同,不会发生堆栈溢出。