所以我正在为一个类的项目工作,我无法理解代码中的错误。我一直看着它,直到我脸色发青。非常感谢任何理解方面的帮助。我正在尝试将值加载到数组中,并让该数组以第二种形式打印列表框中的值。
Private Sub displayStd_Click(sender As Object, e As EventArgs) Handles displayStd.Click
Dim fmtStr As String = "{0,-10}{1,10}{2,15}{3,20}{4,25}"
Dim form As New Form2()
form.displayLB.Items.Clear()
form.displayLB.Items.Add("There are " & Student.Count & " accounts.")
form.displayLB.Items.Add(String.Format(fmtStr, "ID", "Name", "Score1", "Score2", "Average Score"))
For Each studentObj As Student In students
form.displayLB.Items.Add(String.Format(fmtStr, studentObj.ID,
studentObj.Name, studentObj.Score1, studentObj.Score2, studentObj.CalculateAverage(studentObj.Score1, studentObj.Score2)))
Next
form.Show()
Me.Hide()
End Sub
我得到了:
类型'System.NullReferenceException'的未处理异常 发生在Student Record.exe中 附加信息:对象引用未设置为的实例 对象
将此突出显示为错误:
form.displayLB.Items.Add(String.Format(fmtStr, studentObj.ID,
studentObj.Name, studentObj.Score1, studentObj.Score2, studentObj.CalculateAverage(studentObj.Score1, studentObj.Score2)))
CalculateAvg方法:
Public Function CalculateAverage(score1 As Integer, score2 As Integer)
Dim sum As Double
Dim avg As Double
sum = score1 + score2
avg = sum / 2
Return avg
End Function
学生班:
Public Class Student
Private IDVALUE As String
Private nameValue As String
Private score1Value As Integer
Private score2Value As Integer
Private Shared studentCount As Integer
Public Sub New(ByVal id As String, ByVal name As String, ByVal score1 As Integer, ByVal score2 As Integer)
IDVALUE = id
nameValue = name
score1Value = score1
score2Value = score2
End Sub
Public Property ID As String
Get
Return IDVALUE
End Get
Set(value As String)
IDVALUE = value
End Set
End Property
Public Property Name As String
Get
Return nameValue
End Get
Set(value As String)
nameValue = value
End Set
End Property
Public Property Score1 As Integer
Get
Return score1Value
End Get
Set(value As Integer)
score1Value = value
End Set
End Property
Public Property Score2 As Integer
Get
Return score2Value
End Get
Set(value As Integer)
score2Value = value
End Set
End Property
Public Shared Property Count() As Integer
Get
Return studentCount
End Get
Set(ByVal value As Integer)
studentCount = value
End Set
End Property
Public Function CalculateAverage(score1 As Integer, score2 As Integer)
Dim sum As Double
Dim avg As Double
sum = score1 + score2
avg = sum / 2
Return avg
End Function
End Class
Form1 Class:
Public Class Form1
Dim students As Student()
Private Sub addStd_Click(sender As Object, e As EventArgs) Handles addStd.Click
Dim thisStudent As New Student(idTB.Text, nameTB.Text, CInt(score1TB.Text), CInt(score2TB.Text))
ReDim Preserve students(Student.Count + 1)
students(Student.Count + 1) = thisStudent
idTB.Text = ""
nameTB.Text = ""
score1TB.Text = ""
score2TB.Text = ""
End Sub
Private Sub displayStd_Click(sender As Object, e As EventArgs) Handles displayStd.Click
Dim fmtStr As String = "{0,-10}{1,10}{2,15}{3,20}{4,25}"
Dim form As New Form2()
form.displayLB.Items.Clear()
form.displayLB.Items.Add("There are " & Student.Count & " accounts.")
form.displayLB.Items.Add(String.Format(fmtStr, "ID", "Name", "Score1", "Score2", "Average Score"))
For Each studentObj As Student In students
form.displayLB.Items.Add(String.Format(fmtStr, studentObj.ID,
studentObj.Name, studentObj.Score1, studentObj.Score2, studentObj.CalculateAverage(studentObj.Score1, studentObj.Score2)))
Next
form.Show()
Me.Hide()
End Sub
End Class
答案 0 :(得分:1)
我认为您需要使用List(of T)
而不是像这样的数组:
改变这个:
Dim students As Student()
要:
Dim students As New List(Of Student)
这一个:
Private Sub addStd_Click(sender As Object, e As EventArgs) Handles addStd.Click
Dim thisStudent As New Student(idTB.Text, nameTB.Text, CInt(score1TB.Text), CInt(score2TB.Text))
ReDim Preserve students(Student.Count + 1)
students(Student.Count + 1) = thisStudent
idTB.Text = ""
nameTB.Text = ""
score1TB.Text = ""
score2TB.Text = ""
End Sub
对此:
Private Sub addStd_Click(sender As Object, e As EventArgs) Handles addStd.Click
Dim thisStudent As New Student(idTB.Text, nameTB.Text, CInt(score1TB.Text), CInt(score2TB.Text))
students.Add(thisStudent)
idTB.Text = ""
nameTB.Text = ""
score1TB.Text = ""
score2TB.Text = ""
End Sub
现在,如果您想使用Array,我认为您需要overload
New
,例如:
Public Sub New()
End Sub
然后你可以像这样实例化:
Dim students As New Student()
因为无法在New(ByVal id As String, ByVal name As String, ByVal score1 As Integer, ByVal score2 As Integer)
的参数上添加值,无法在您的案例中进行实例化。
答案 1 :(得分:1)
您没有初始化学生数组。
Dim students As Student()
应该是;
Dim students() As Student = New Student() {} 'empty array
ReDim部分;
ReDim Preserve students(Student.Count)
students(Student.Count - 1) = thisStudent