我不知道什么在我的应用程序造成的。它是什么?我创建了一个类(该类是在另一文件)的一个新实例,但在第一次调用它抛出一个计算器异常的方法。

这是我觉得逻辑上抛出一个异常计算器的唯一的事情是,如果有人downvoted乔恩斯基特。

但严重的是,现在,是什么呢?我周围有创建在同一个文件作为第一类另一个类,并使用该调用的方法对我来说。

有帮助吗?

解决方案

作为一般规则,堆栈溢出异常是通过递归算法,其中递归的深度超过了(通常)固定堆栈限制所致。这通常是在该算法中的一个错误的结果,但它也可以由要应用的算法来过于“深”的数据结构引起的。

这里的一个车递归的一个简单的例子(没有特定的PL)。

function int length(list l) {
    if (empty(l)) {
        return 0;
    } else {
        return 1 + length(l);  // should be 'return 1 + length(tail(l));
    }
}

对于任何非空列表呼叫长度将给出在一个典型的编程语言中的堆栈溢出。但即使你改正错误,调用该方法的一个长长的清单很可能导致堆栈溢出。

(唯一的例外是当您使用的语言......或更严格的编译器...,支持尾递归优化。)

其他提示

一个计算器例外是当你超过所分配的堆栈大小,这通常由递归调用的方法发生,并且永远不会离开,它也可以是通过各种晦涩方法链接原因。问题是,你可能有东西在对象以下的程度。

void MyMethod()
{
    MyMethod();
}

在调用将吃起来从未释放所使用的堆栈空间,因为呼叫不会结束执行和入口点必须保持。

P.S。 SO被任命为有问题的特定异常(这是根本,而不是仅限于.NET),它只是一个开发者网站一个聪明的名称。

StackOverFlows例外的是正是他们听起来像,栈溢出。这通常是因为你有你的方法循环依赖。例如方法A呼叫B和B调用A.或者它可能是没有碱的情况下的递归方法。

在没有看到它的代码是不可能告诉为什么会这样,但是当一个线程溢出其调用堆栈一个StackOverflowException被抛出。这当一个方法递归调用自己没有任何这样条件的中断创造无限递归最常发生。由于每个递归创建一个新的堆栈帧的无限循环,理论上创建堆栈帧无限多的,我相信你现在可以看到为什么术语“堆栈溢出”是恰当的。

堆栈是其中计算机存储的当前正在调用的函数,和所使用的变量和参数的列表。所以,如果函数main调用函数A,然后函数A调用函数B,和他们使用的变量c,d和E,堆栈将包含所有的这些信息。然而,堆栈只有这么大。所以,如果函数B然后调用函数C,它调用函数d ...等,上百个嵌套函数结束了,最终,堆栈会“溢出” - 没有足够的空间来存储另一个函数调用

至于其他人都注意到,这通常用递归函数发生(其中函数B调用函数B,然后调用函数B ...) - 最终,堆栈溢出。你需要找到此递归函数被调用,为什么它不是递归循环的突破时,它应该。

当然,该问题可能不是它的一个有错误的递归算法 - 它可能只是的函数调用的次数超过所述堆栈的大小。所以,如果你的算法必须调用递归函数几百倍的潜力,它可能是。

这通常是由递归调用,其中该递归调用从不终止的功能而引起的。您可以通过多种方式得到这个。的一种方法是不存在碱情况下的递归算法,另一种常见的一种是创建对象A和B创建在它们的构造彼此之一,等等。

我建议你通过调试步骤,并找出:)

我最近移植旧VB6应用到VB.NET,其使用的怪异递归函数来排序同样大的数据量。该算法是好的,但执行一直引起堆栈溢出错误。多摆弄之后,我意识到,VB是做给后面的代码大的魔力:易型铸造是有代价的。所以,递归函数依赖太多的后期绑定,而不是使用类型变量,这导致了大量的铸造,解析等开销(一个单一的代码行可能从2至10函数调用...)的,很明显,取得了堆栈溢出。

TL; DR:使用DirectCast()和静态结合(类型变量),以防止从VB在一个递归函数在运行时充斥堆

我有这个问题发生,我发现我打错lstEncounter。正如我在C ++类了解到,问题是基本使用相同的参数调用自身的递归算法。我的例子,其中我得到了错误:

Property Encounter(ByVal N As Integer)
    Get
        If N < lstEncounters.Count Then
            Return Encounter(N)
        Else
            Return Nothing
        End If
    End Get
    Set(value)
        lstEncounters(N) = value
    End Set
End Property

我有一个#1的错误。 我使用添加1到柜台再重新调用同一例程的程序。 大约每2500到3000的循环,我得到了计算器错误。 我添加了一个DO ...循环调用的程序中,我使用VB快递:

在:

Public Sub mainloop()

Dim cntr as integer

If cntr >= 5000  ( I just picked a number at random)

    me.close  ( I close the program)

...               (This is where I would manipulate the cntr for diff 
results)

cntr = cntr + 1  ( increment the cntr)

mainloop()        (re call my loop) 

End IF

End Sub

(前面说过,在大约2500-3000我会得到错误#1)

在:(地点此执行第一)

Dim LoopCntr as integer

Do While LoopCntr <= 40000  (this my number.. Use your own number)

If LoopCntr > 40000 Then

        Exit Do
End If

mainloop()       (The mainloop() has not been changed just the method of calling it)
LoopCntr = LoopCntr + 1

Loop

me.close        (When LoopCntr reaches max it closes the program)

(添加Do..Loop后我的程序运行40000时间没有 “#1”)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top