2011-10-07 75 views
2

据我所知,这是不好的编程习惯和冗余编码,但我很好奇。Function Calling Itself,Can not Dodge StackOverflow Error

我只是在一个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 
+0

你为什么要从add()调用'add()'?让'While'循环来照顾它。 – mellamokb

+0

@mellamokb我知道它的糟糕的编程习惯,我很好奇如果这样一个方法来处理这个异常而不会崩溃 – sealz

+1

这就像要求如何吹灭自己的大脑而不死。 (答案:错过。) –

回答

3

因为VB.NET不支持tail recursion,有没有办法可以让无限递归没有最终溢出堆栈。

+0

从技术上讲,它不是无限的(它停在9999999):-)。在.NET中可以增加堆栈大小吗? – mellamokb

+4

@mellamokb:“Try ... Catch”内部第一次调用'add()'的函数永远不会返回,所以'While ...'不起作用。 –

+0

'function oop(){oop();返回“哎呀,我的坏,你是对的!”; }' – mellamokb

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 
4

有没有办法忽略这个错误

号你能做的就是避免引起它摆在首位的唯一的事。大多数情况下,StackOverflowExceptions是不可捕获的。从MDSN

从.NET Framework 2.0版开始,StackOverflowException对象不能被try-catch块捕获,并且相应的进程默认终止。

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 

保持你的代码的其余部分相同,堆栈溢出将不会发生。