Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 为什么我的程序在循环结束前就崩溃了?_Vb.net - Fatal编程技术网

Vb.net 为什么我的程序在循环结束前就崩溃了?

Vb.net 为什么我的程序在循环结束前就崩溃了?,vb.net,Vb.net,所以我遇到的问题是,我的程序似乎在循环中的第二个最后增量之后崩溃/没有响应。我的程序是询问用户课堂上的学生人数,测试的最高分数,然后循环学生人数,用户给程序学生姓名和他们的测试分数,然后在其中进行其他计算。 分数名称、分数等的详细信息在每个循环结束时的多列列表视图中更新。程序在循环的第一个增量中运行良好,但之后失败。下面是执行此操作的sub的代码: Private Sub btnData_Click(ByVal sender As System.Object, ByVal e As System

所以我遇到的问题是,我的程序似乎在循环中的第二个最后增量之后崩溃/没有响应。我的程序是询问用户课堂上的学生人数,测试的最高分数,然后循环学生人数,用户给程序学生姓名和他们的测试分数,然后在其中进行其他计算。 分数名称、分数等的详细信息在每个循环结束时的多列列表视图中更新。程序在循环的第一个增量中运行良好,但之后失败。下面是执行此操作的sub的代码:

Private Sub btnData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnData.Click

    Dim NumStudent, HighestMark, LowestMark, ClassTotal, ClassMean, count As Integer
    Dim HscScore As Decimal

    Dim HscBand(5) As Integer
    Dim Band1 As Integer = HscBand(0)
    Dim Band2 As Integer = HscBand(1)
    Dim Band3 As Integer = HscBand(2)
    Dim Band4 As Integer = HscBand(3)
    Dim Band5 As Integer = HscBand(4)
    Dim Band6 As Integer = HscBand(5)

    NumStudent = InputBox("Enter the number of students for this test")
    NumStudent = NumStudent - 1

    MaxScore = InputBox("Enter the maximum score for this test")


    Dim student(NumStudent) As StudentHSC



    For count = 0 To NumStudent
        student(count).StudentName = InputBox("Enter the student's name")

        student(count).StudentScore = InputBox("Enter the student's score for the test")
        If student(count).StudentScore > MaxScore Then
            MessageBox.Show("You can not enter a number higher than the max score, please enter it again")
            student(count).StudentScore = InputBox("Enter the student's score for the test")
        End If

        HscScore = student(count).StudentScore / MaxScore * 100
        student(count).HscMark = Format(HscScore, "0.00")

        If student(count).HscMark < 50 Then
            student(count).HscRank = 1
            HscBand(0) = HscBand(0) + 1
            lstStuData.Items.Add(New ListViewItem(New String() {student(count).StudentName, student(count).StudentScore, student(count).HscMark, student(count).HscRank}))

        ElseIf student(count).HscMark = 50 And student(count).HscMark < 60 Then
            student(count).HscRank = 2
            HscBand(1) = HscBand(1) + 1
            lstStuData.Items.Add(New ListViewItem(New String() {student(count).StudentName, student(count).StudentScore, student(count).HscMark, student(count).HscRank}))

        ElseIf student(count).HscMark = 60 And student(count).HscMark < 70 Then
            student(count).HscRank = 3
            HscBand(2) = HscBand(2) + 1
            lstStuData.Items.Add(New ListViewItem(New String() {student(count).StudentName, student(count).StudentScore, student(count).HscMark, student(count).HscRank}))

        ElseIf student(count).HscMark = 70 And student(count).HscMark < 80 Then
            student(count).HscRank = 4
            HscBand(3) = HscBand(3) + 1
            lstStuData.Items.Add(New ListViewItem(New String() {student(count).StudentName, student(count).StudentScore, student(count).HscMark, student(count).HscRank}))

        ElseIf student(count).HscMark = 80 And student(count).HscMark < 90 Then
            student(count).HscRank = 5
            HscBand(4) = HscBand(4) + 1
            lstStuData.Items.Add(New ListViewItem(New String() {student(count).StudentName, student(count).StudentScore, student(count).HscMark, student(count).HscRank}))

        ElseIf student(count).HscMark = 90 And student(count).HscMark < 101 Then
            student(count).HscRank = 6
            HscBand(5) = HscBand(5) + 1
            lstStuData.Items.Add(New ListViewItem(New String() {student(count).StudentName, student(count).StudentScore, student(count).HscMark, student(count).HscRank}))

        End If







    Next

我鼓励您使用严格基于声明的选项进行编码,以避免依赖于从一种类型到另一种类型的隐式转换

您的问题的答案是,您已经声明了一个包含NumStudents+1元素的StudentHSC对象数组。StudentHSC是引用类型,因此数组的每个元素都是指向对象的指针。在使用New关键字在堆上创建对象之前,每个指针都不指向任何对象或不指向任何对象。因此,如果您尝试为元素的属性(例如StudentName)赋值,您将得到一个空引用异常。要解决此问题,请在For循环的顶部插入以下行:

student(count) = New StudentHSC
您没有显示StudentHSC类,所以我假设它有一个不带参数的构造函数

因此For循环的开始应该如下所示:

For count = 0 To NumStudent
    student(count) = New StudentHSC
    student(count).StudentName = InputBox("Enter the student's name")
If student(count).HscMark < 50 Then
    student(count).HscRank = 1
    HscBand(0) = HscBand(0) + 1
    lstStuData.Items.Add(New ListViewItem(New String() {student(count).StudentName, student(count).StudentScore.ToString, student(count).HscMark.ToString, student(count).HscRank.ToString}))
ElseIf student(count).HscMark >= 50 AndAlso student(count).HscMark < 60 Then
    student(count).HscRank = 2
    HscBand(1) = HscBand(1) + 1
    lstStuData.Items.Add(New ListViewItem(New String() {student(count).StudentName, student(count).StudentScore.ToString, student(count).HscMark.ToString, student(count).HscRank.ToString}))
ElseIf student(count).HscMark >= 60 AndAlso student(count).HscMark < 70 Then
    student(count).HscRank = 3
    HscBand(2) = HscBand(2) + 1
    lstStuData.Items.Add(New ListViewItem(New String() {student(count).StudentName, student(count).StudentScore.ToString, student(count).HscMark.ToString, student(count).HscRank.ToString}))
ElseIf student(count).HscMark >= 70 AndAlso student(count).HscMark < 80 Then
    student(count).HscRank = 4
    HscBand(3) = HscBand(3) + 1
    lstStuData.Items.Add(New ListViewItem(New String() {student(count).StudentName, student(count).StudentScore.ToString, student(count).HscMark.ToString, student(count).HscRank.ToString}))
ElseIf student(count).HscMark >= 80 AndAlso student(count).HscMark < 90 Then
    student(count).HscRank = 5
    HscBand(4) = HscBand(4) + 1
    lstStuData.Items.Add(New ListViewItem(New String() {student(count).StudentName, student(count).StudentScore.ToString, student(count).HscMark.ToString, student(count).HscRank.ToString}))
ElseIf student(count).HscMark >= 90 AndAlso student(count).HscMark <= 100 Then
    student(count).HscRank = 6
    HscBand(5) = HscBand(5) + 1
    lstStuData.Items.Add(New ListViewItem(New String() {student(count).StudentName, student(count).StudentScore.ToString, student(count).HscMark.ToString, student(count).HscRank.ToString}))
End If
此外,您还有许多未使用或冗余的变量,您应该验证输入框的用户输入,以确保提供了数值

编辑:

If子句应如下所示:

For count = 0 To NumStudent
    student(count) = New StudentHSC
    student(count).StudentName = InputBox("Enter the student's name")
If student(count).HscMark < 50 Then
    student(count).HscRank = 1
    HscBand(0) = HscBand(0) + 1
    lstStuData.Items.Add(New ListViewItem(New String() {student(count).StudentName, student(count).StudentScore.ToString, student(count).HscMark.ToString, student(count).HscRank.ToString}))
ElseIf student(count).HscMark >= 50 AndAlso student(count).HscMark < 60 Then
    student(count).HscRank = 2
    HscBand(1) = HscBand(1) + 1
    lstStuData.Items.Add(New ListViewItem(New String() {student(count).StudentName, student(count).StudentScore.ToString, student(count).HscMark.ToString, student(count).HscRank.ToString}))
ElseIf student(count).HscMark >= 60 AndAlso student(count).HscMark < 70 Then
    student(count).HscRank = 3
    HscBand(2) = HscBand(2) + 1
    lstStuData.Items.Add(New ListViewItem(New String() {student(count).StudentName, student(count).StudentScore.ToString, student(count).HscMark.ToString, student(count).HscRank.ToString}))
ElseIf student(count).HscMark >= 70 AndAlso student(count).HscMark < 80 Then
    student(count).HscRank = 4
    HscBand(3) = HscBand(3) + 1
    lstStuData.Items.Add(New ListViewItem(New String() {student(count).StudentName, student(count).StudentScore.ToString, student(count).HscMark.ToString, student(count).HscRank.ToString}))
ElseIf student(count).HscMark >= 80 AndAlso student(count).HscMark < 90 Then
    student(count).HscRank = 5
    HscBand(4) = HscBand(4) + 1
    lstStuData.Items.Add(New ListViewItem(New String() {student(count).StudentName, student(count).StudentScore.ToString, student(count).HscMark.ToString, student(count).HscRank.ToString}))
ElseIf student(count).HscMark >= 90 AndAlso student(count).HscMark <= 100 Then
    student(count).HscRank = 6
    HscBand(5) = HscBand(5) + 1
    lstStuData.Items.Add(New ListViewItem(New String() {student(count).StudentName, student(count).StudentScore.ToString, student(count).HscMark.ToString, student(count).HscRank.ToString}))
End If

不确定,因为他正在使用0中的索引。您在哪一行上遇到了什么错误?请在循环的开头放置一个断点并单步执行每一行来调试代码。你会发现它是这样的。可能是我编辑的文章的副本,现在它包括了结构和公共变量。我还包括你包含的代码吗?有了额外的代码,情况就完全不同了。我假设StudentHSC被声明为一个类,因此是一个引用类型,但您已经将它声明为一个结构,使其成为一个值类型。因此,使用默认值初始化Integer和String等基本数据类型的成员,不需要调用studentcount=New StudentHSC。使用结构而不是类,我无法引发错误。你能澄清一下在你这边发生了什么吗?另外,最高分数、最低分数、班级总数、班级平均数和学生数都是未使用的变量。MaxScore声明两次,一次声明为公共整数,一次声明为局部小数。Band1到Band 6以及HscBand数组的元素都被分配了没有任何意义的值。在循环的最后一个增量中,vbhost.exe或任何它所称的东西会在测试崩溃时加载程序,例如它没有响应并停止工作。这发生在最后一个增量中。假设我输入了5个学生,它循环通过,我输入了详细信息,它显示了4个学生的详细信息姓名、分数等。当我输入最后一个学生姓名和分数时,它不会显示在视图列表上,而是崩溃。我假设这与numstudent变量是numstudent-1有关?它起作用了!在您进行编辑之前,我已经在>=中添加了rest,但我没有替换