2011-10-07 74 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 

保持你的代碼的其餘部分相同,堆棧溢出將不會發生。