-1

我正在尝试为男性、女性两个字段范围内的值计算百分比。

在EmployeesData.vb

Public Function getPercentMen() As Double

Dim result As Double

result = 0

If Men + Women > 0 Then result = (Men * 100) / (Men + Women)
        End If

Return result

End Function

在我的 Demographics.vb 我有以下输出:

Private Sub updateView()


    ' The percentage Men and Women recorded is displayed in
    ' the appropriate text boxes.

    percentMenTextBox.Text = fEmployeesData.getPercentMen().ToString()
    percentWomenTextBox.Text = fEmployeesData.getPercentWomen().ToString()

    updateView()
End Sub

我得到的错误是

An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll

Visual Studio 将我指向以下行

percentMenTextBox.Text = fEmployeesData.getPercentMen().ToString()

我认为问题在于我试图错误地将 Double 强制转换为 String 或类似的东西

我已经添加了整个班级

Public Class EmployeesData
    Private fMen As Integer
    Private fWomen As Integer

    Public Sub New()
        fMen = 0
        fWomen = 0
    End Sub

    Public ReadOnly Property Men As Integer
        Get
            Return fMen
        End Get
    End Property

    Public ReadOnly Property Women As Integer
        Get
            Return fWomen
        End Get
    End Property

    Public Sub addMen()
        fMen = fMen + 1
    End Sub

    Public Sub addWomen()
        fWomen = fWomen + 1
    End Sub

    Public Function getPercentMen() As Double
        Dim result As Double
        result = 0
        If Men + Women > 0 Then
            result = (Men * 100) / (Men + Women)
        End If
        Return result
    End Function

    Public Function getPercentWomen() As Double
        Dim result As Double
        result = 0
        If Men + Women > 0 Then
            result = (Women * 100) / (Men + Women)
        End If
        Return result
    End Function

    Public Sub reset()
        fMen = 0
        fWomen = 0
    End Sub
End Class
4

2 回答 2

3

此错误的原因是这部分:

Private Sub updateView()


'... snipped

    updateView()
End Sub

您在这里所拥有的基本上是一个永无止境的循环,递归地调用一个子例程(它添加到堆栈中),最终将导致堆栈溢出。

VS 指向您的原因fEmployeesData.getPercentMen()是该调用基本上是使玻璃溢出的下降,可以这么说,因为它对此时已满的堆栈执行了额外的添加。换句话说,错误消息具有误导性,因为它很可能是下一次调用,或者是下一次往返调用本身。

updateView()解决方案是从自身内部删除调用。只能从外部代码调用它。如果您需要不断地调用它,请考虑使用计时器,或者仅在需要时从事件中使用它。

您的其他代码很好,与此错误无关。

希望这可以帮助。

于 2012-11-12T20:19:02.583 回答
0

我在这里看到两个问题。首先,我猜你使用的 Men 和 Women 变量都是整数,所以你看到的是整数除法。整数除以整数的结果仍然是……整数。

试试这个:

Public Function getPercentMen() As Double

    Dim result As Double = 0.0  
    If Men + Women > 0 Then result = (Men * 100.0) / (Men + Women)   
    Return result

End Function

其次,要获得 StackOverflow 异常,您可能有一个自引用属性。检查您的 Men 和 Women 变量是如何实现的。如果他们使用自己,或者如果他们使用这个 getPercentMen() 方法,您可以创建一个没有基本情况的递归调用,这将导致 StackOverflow。

于 2012-11-12T19:12:16.877 回答