2016-02-14 135 views
-1

此程序的工作原理如下:用户输入楼层名称和楼层数量,然后验证并接受。然后,用户输入每层的价格,直到它通过所有楼层,数据被添加到列表框中,然后用户输入所需的楼层,并将租金和其他信息添加到另一个列表框下方。只要我输入楼层数并单击按钮保存信息,程序就会在btnEnterBuilding Click事件下运行dblRates(intHowMany)= dblRent时发生错误。该错误是(VB.NET)未将对象引用设置为对象的实例

“类型‘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 
+3

可能重复[什么是NullReferenceException,我该如何解决它?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-doi-i-fix-它) – Blackwood

+0

另请参见[后关于创建数组](http://stackoverflow.com/questions/35003606/when-do-i-need-to-use-a-new-keyword-when-creating-an-array/ 35004563#35004563) – Plutonix

回答

1

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