Visual Studio 2017数组报错:System.NullReferenceException修复求助
修复VB.NET中的System.NullReferenceException错误
你遇到的System.NullReferenceException是因为你声明的数组没有被初始化。在VB.NET中,当你写Dim StudentName() As String这种语法时,只是声明了一个数组变量,但它并没有指向实际的数组对象(也就是Nothing),直接给它的索引赋值自然会报错。另外你的代码里还有索引逻辑的问题,比如btnAdd里Index自增后去访问StudentName(Index),这时候这个位置还没有被赋值,也会出问题。
推荐解决方案:改用List(Of T)代替数组
数组需要预先指定大小,对于这种动态添加学生信息的场景,List(Of T)是更合适的选择——它支持动态扩容,不需要手动管理大小,避免空引用和数组越界问题。下面是修改后的完整代码:
Public Class Form1 ' 用List存储学生信息,支持动态添加 Private studentNames As New List(Of String)() Private exam1Scores As New List(Of Integer)() Private exam2Scores As New List(Of Integer)() Private exam3Scores As New List(Of Integer)() Private Sub btnDetails_Click(sender As Object, e As EventArgs) Handles btnDetails.Click lstStudent.Items.Clear() ' 清空列表,避免重复显示 ' 遍历所有学生,拼接信息后添加到列表 For i As Integer = 0 To studentNames.Count - 1 ' 优化信息展示格式,更易读 Dim studentInfo As String = $"{studentNames(i)} | 考试1: {exam1Scores(i)} 分 | 考试2: {exam2Scores(i)} 分 | 考试3: {exam3Scores(i)} 分" lstStudent.Items.Add(studentInfo) Next End Sub Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click ' 先验证成绩输入是否有效,避免转换失败 Dim mark1, mark2, mark3 As Integer If Not Integer.TryParse(txtMark1.Text, mark1) OrElse Not Integer.TryParse(txtMark2.Text, mark2) OrElse Not Integer.TryParse(txtMark3.Text, mark3) Then MessageBox.Show("请输入有效的整数成绩!") Return End If ' 将输入的信息添加到对应List中 studentNames.Add(txtStudentName.Text.Trim()) exam1Scores.Add(mark1) exam2Scores.Add(mark2) exam3Scores.Add(mark3) ' 清空输入框,方便下一次输入 txtStudentName.Clear() txtMark1.Clear() txtMark2.Clear() txtMark3.Clear() txtStudentName.Focus() End Sub End Class
关键改动说明:
- 替换数组为List:
List(Of T)的Add方法可以直接添加元素,不需要提前初始化大小,彻底解决空引用问题。 - 添加输入验证:用
Integer.TryParse检查成绩是否为有效整数,避免用户输入非数字时抛出转换错误。 - 优化信息展示:修改了学生信息的拼接格式,让输出更清晰易读,同时修复了原代码中
Identity拼接时的逻辑错误(原代码直接把成绩连在一起,没有分隔,还误用了乘法)。 - 清理输入框:添加了清空输入框的逻辑,提升用户体验。
如果你坚持要使用数组,需要先初始化数组的大小(比如Dim StudentName(9) As String,最多存10个学生),并且在Index达到数组长度时手动扩容,但这种方式不如List灵活,所以更推荐上面的List方案。
内容的提问来源于stack exchange,提问作者George Hales
相关产品推荐
相关产品推荐

