(VB.NET)对象引用未设置为对象的实例

时间:2016-02-14 00:41:28

标签: vb.net visual-studio-2015

此程序的工作方式如下:用户输入建筑物名称和楼层数,并进行验证和接受。然后,用户输入每个楼层的费率,直到它通过所有楼层,数据被添加到列表框,然后用户输入所需的楼层,并将租金和其他信息添加到另一个列表框中。一旦我输入我的楼层数并单击按钮保存信息,程序就会在btnEnterBuilding Click事件中遇到错误,其中它表示dblRates(intHowMany)= dblRent。错误是

"未处理的类型' System.NullReferenceException'发生在WindowsApplication5.exe

附加信息:未将对象引用设置为对象的实例。"

非常感谢任何帮助,谢谢!

Option Explicit On
Option Strict On
Option Infer Off
Public Class Form1
    Dim dblRates() As Double
    Dim intHowMany As Integer = 0 'points to the next avail entry in the array
    Private Function ValidateString(ByVal strText As String, strInput As String, strValue As String) As Boolean
        If strText = Nothing Then
            MessageBox.Show(strText & " Must Be Supplied", "Error")
            Return False
        Else
            Return True
        End If
    End Function
    Private Function ValidateInteger(ByVal strText As String,
                                     ByVal strIn As String,
                                     ByRef intValue As Integer,
                                     ByVal intMinValue As Integer,
                                     ByVal intMaxValue As Integer) As Boolean
        If strIn = Nothing Then
            MessageBox.Show(strText & " Must Be Supplied", "Error")
            Return False
        Else
            If Integer.TryParse(strIn, intValue) = False Then
                MessageBox.Show(strText & " Must Be A Whole Number", "Error")
                Return False
            Else
                If intValue < intMinValue Or intValue > intMaxValue Then
                    MessageBox.Show("Outside of Number of " & strText & " Limits", "Error")
                    Return False
                Else
                    Return True
                End If
            End If
        End If
    End Function
    Private Function ValidateDouble(ByVal strText As String,
                                     ByVal strDbl As String,
                                     ByRef dblValue As Double,
                                     ByVal dblMinValue As Double,
                                     ByVal dblMaxValue As Double) As Boolean
        If strDbl = Nothing Then
            MessageBox.Show(strText & " Must Be Supplied", "Error")
            Return False
        Else
            If Double.TryParse(strDbl, dblValue) = False Then
                MessageBox.Show(strText & " Must Be A Whole Number", "Error")
                Return False
            Else
                If dblValue < dblMinValue Or dblValue > dblMaxValue Then
                    MessageBox.Show("Outside of Number of " & strText & " Limits", "Error")
                    Return False
                Else
                    Return True
                End If
            End If
        End If
    End Function
    Private Sub Form1_Load(sender As Object,
                           e As EventArgs) Handles Me.Load
        Me.grpBuilding.Enabled = True
        Me.grpRents.Enabled = False
        Me.grpDesiredFloor.Enabled = False
    End Sub
    Private Sub btnRents_Click(sender As Object,
                                e As EventArgs) _
                                Handles btnRents.Click
        Dim strName, strFloors As String
        Dim intFloors As Integer
        strName = txtName.Text
        strFloors = txtFloors.Text
        intFloors = CInt(strFloors)
        If ValidateString("Building name", Me.txtName.Text, strName) = True Then
            If ValidateInteger("Number of floors", Me.txtFloors.Text, intFloors, 3, 20) = True Then
                Me.grpBuilding.Enabled = False
                Me.grpRents.Enabled = True
                Me.grpDesiredFloor.Enabled = False
            End If
        End If


    End Sub

    Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
        Close()
    End Sub

    Private Sub btnEnterBuilding_Click(sender As Object,
                                    e As EventArgs) _
                                    Handles btnEnterBuilding.Click
        Dim intFloors As Integer
        Dim dblRent As Double
        Dim strRent As String
        strRent = txtRent.Text
        dblRent = CDbl(strRent)
        If ValidateDouble("Rent", Me.txtRent.Text, dblRent, 1000.0, 2500.0) = True Then
            dblRates(intHowMany) = dblRent
            Me.txtRent.Focus()
            Me.txtRent.SelectAll()
            Me.ListBox1.Items.Add("Floor No. " & intHowMany.ToString("N0") &
                                    "  -- Rent Is: " & dblRent.ToString("N$"))
            If intHowMany < intFloors Then
                intHowMany += 1
            Else
                Me.grpBuilding.Enabled = False
                Me.grpRents.Enabled = False
                Me.grpDesiredFloor.Enabled = True
            End If
        Else
            Me.txtRent.Focus()
            Me.txtRent.SelectAll()
        End If
    End Sub

    Private Sub btnCompute_Click(sender As Object, e As EventArgs) Handles btnCompute.Click
        Dim intFloors, intFloor As Integer
        Dim strName, strFloors As String
        strName = txtName.Text
        strFloors = txtFloors.Text
        intFloors = CInt(strFloors)
        If ValidateInteger("Desired Floor", Me.txtFloor.Text, intFloor, 3, 20) = False Then
            MessageBox.Show("Please enter a valid floor number", "Error",
                            MessageBoxButtons.OK, MessageBoxIcon.Error)
        Else
            Me.lstDisplay.Items.Add("Building Name: " & strName & " # of Floors: " & intFloors.ToString)
            Me.lstDisplay.Items.Add("Desired Floor: " & intFloor.ToString)
            Me.lstDisplay.Items.Add(" Rent: " & intFloors.ToString)
        End If
    End Sub
End Class

1 个答案:

答案 0 :(得分:1)

如果没有给出初始值,你就不能dim dblRates() as double这样。您需要dim dblRates(<some amount>) as Double,然后在必要时重新添加它以向其添加更多值。或者您可以Dim dblRates() as double = {0},但如果您仍想为数组添加更多值,则仍需要重新设置它,因为第二个选项只会创建一个包含1个元素的数组。