簡體   English   中英

C#NullReferenceException拋出:My StudentList靜態類數組為null

[英]C# NullReferenceException Thrown: My StudentList static class array is null

我一直在試圖弄清楚我的代碼正在發生什么。 我編寫了一個應用程序,用戶可以通過GUI應用程序輸入學生的成績。 第一個表單顯示選項,下一個表單輸入學生信息(姓名,人數,分數),最后一個表單顯示學生信息的摘要(學生總數,最高分數,最低分數,姓名成績最高的學生,學生名單)。

為了存儲所有學生條目,我做了一個學生班。 我創建了一個靜態的Student數組,並將其放在我的ProgramFunctions類文件(所有靜態方法)中。

當我嘗試運行顯示學生摘要的表單時,它就是崩潰的地方-如果查看“自動”選項卡,它會告訴我Student [a]的值為null(我使用了for循環遍歷每個數組中的學生對象)。 我確實跟蹤了添加學生的過程,並確實表明我已經向Student數組添加了新條目。

我的計算方法(最高標記,最低標記,平均值)將引發異常。 這是我的代碼:

class ProgramFunctions
{
    private static Student[] studentList = new Student[25];
    private static int counter = 0;

    public static void addNewStudent(Student newStudent)
    {
        if (studentList.Count() == counter)
        {
            MessageBox.Show("The Student List is Full", "List is Full");
        }
        else
        {
            studentList[counter] = newStudent;
            counter++;
        }

    }

    public static void displayErrorMessage(String message, String title)
    {
        MessageBox.Show(message, title);
    }

    public static TextBox validateTextBox(int textboxNumber, TextBox thisTextBox)
    {
        if (textboxNumber.Equals(1)) //Student Name textbox
        {
            if (thisTextBox.Text.Length < 0 || thisTextBox.Text.Length > 100)
            {
                displayErrorMessage("The Student Name specified is out of allowed region (greater than 100 or less than 0 characters. Please fix this", "Student Name Error");
            }
            else
            {
                thisTextBox.Text = thisTextBox.Text.Trim();
                return thisTextBox;
            }
        }
        else if (textboxNumber.Equals(2)) //Student number text box (only 10 characters allowed)
        {
            if (thisTextBox.Text.Length < 0 || thisTextBox.Text.Length > 10)
            {
                displayErrorMessage("The student number you specified is greater than 10 characters or less than 0. Please fix this", "Student Number Error");
            }
            else
            {
                thisTextBox.Text = thisTextBox.Text.Trim();
                return thisTextBox;
            }
        }
        else
        {
            if (thisTextBox.Text.Length > 2 || thisTextBox.Text.Length < 0)
            {
                displayErrorMessage("Invalid Length for exam mark", "Invalid Exam Mark");
            }
            else
            {
                thisTextBox.Text = thisTextBox.Text.Trim();
                return thisTextBox;
            }
        }
        return null;
    }

    public static int getMaximumMarkPosition()
    {
        int highestMark = -999;
        int positionFound = -1; 

        for (int a = 0; a < counter; a++)
        {
            if (studentList[a].getExamMark > highestMark)
            {
                highestMark = studentList[a].getExamMark; //This is where the error would occur
                positionFound = a;
            }
        }

        return positionFound;
    }

    public static int getHighestMark(int position)
    {
        return studentList[position].getExamMark;
    }

    public static int getLowestMark(int position)
    {
        return studentList[position].getExamMark;
    }

    public static string getHighestStudentMarkName(int position)
    {
        return studentList[position].getStudentName;
    }

    public static int getLowestMarkPosition()
    {
        int lowestMark = 999;
        int positionFound = -1;
        int studentMark = 0;

        for (int a = 0; a < studentList.Count(); a++)
        {


            studentMark = studentList[a].getExamMark; //This is where the error would occur
            if (studentMark < lowestMark)
            {
                lowestMark = studentMark;
                positionFound = a;
            }
        }

        return positionFound;
    }

    public static double calculateClassAverage()
    {
        double sum = 0;
        double average = 0;

        for (int a = 0; a < studentList.Count(); a++)
        {
            sum = sum + studentList[a].getExamMark;
        }

        average = sum / studentList.Count();

        return average;
    }

    public static int getTotalNumberOfStudents()
    {
        return counter;
    }

    public static RichTextBox getTextBoxData(RichTextBox thisTextBox)
    {
        thisTextBox.Text = "STUDENT MARK DATA: \n\n";

        for (int a = 1; a < studentList.Count(); a++)
        {
            Student currentStudent = returnStudentInformation(a);
            thisTextBox.Text = thisTextBox.Text + "\n" + currentStudent.getStudentName + "\t\t" + currentStudent.getExamMark + "\t" + currentStudent.getStudentNumber;
        }

        return thisTextBox;
    }

    public static Student returnStudentInformation(int index)
    {
        return studentList[index];
    }

}

}

在我看來,如果學生列表未完全訪問計數器或更高級別的任何索引,將導致空對象。 我建議只循環進行反擊:

for (int a = 1; a < counter; a++)
{
    Student currentStudent = returnStudentInformation(a);
    thisTextBox.Text = thisTextBox.Text + "\n" + currentStudent.getStudentName + "\t\t" + currentStudent.getExamMark + "\t" + currentStudent.getStudentNumber;
}

所有這些都引出了一個問題,即為什么在List<T>可用且針對動態數據而創建時為何將靜態數組用於動態數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM