初学者头痛:来自ASP.NET webfrom上的数组的NullReferenceException

时间:2012-09-20 03:11:11

标签: c# asp.net arrays nullreferenceexception

我为我的ASP.NET类创建了一个程序来创建一个类名和编号,然后输入十个带有学生ID的学生姓名。因此,我的网页将提示用户输入这4个信息片段,将它们分成 MyClass(课程名称和编号)学生班级(其中包含学生姓名和ID) 即可。我非常关注NullReferenceException错误,并且不知道该怎么做。如果有人在这里可以给我一些指示和方向,那么我可以从这项任务中挑选自己。有一件事是肯定的,我不允许输入任何新的方法和变量。我只能使用我初始化的当前文件。

  • Student []数组是一个数组,用于保存我的Student类,其中包含学生的姓名和ID。
  • 用户首先会创建一个班级编号和名称,然后在其中添加学生(带有ID和姓名)。
  • 只允许一个班级姓名和号码(他们一起),最多只有10名学生。

我在MyClass中的ToString()方法获取null异常,其中classNumberAndName + =((Student)students [i])。ToString(); < / p>

这是我的代码,没有语法错误。

public class MyClass
{
    private string courseNumber;
    private string courseName;
    private int numberOfStudents;
    private Student[] students;       
    public MyClass(string CourseNumber , string CourseName, Student[] Student)
    {
        students = new Student[Student.Length];
        courseNumber = CourseNumber;
        courseName = CourseName;
        for (int i = 0; i < Student.Length; i++)
        {
            Student tmpArrayStudent = new Student(((Student)students[i]).ToString(),((Student)students[i]).ToString());
            tmpArrayStudent = students[i];
        }
    }   
    public MyClass(string CourseNumber, string CourseName)
    {
        courseNumber = CourseNumber;
        courseName = CourseName;
        students = new Student[10];
    }
    public void addAStudent(Student student)
    {//possible to create temp array?
        Student[] students = new Student[10];
        if(numberOfStudents < students.Length)
        {
            students[numberOfStudents] = student;
            numberOfStudents++;
        }
        else
        {
            throw new Exception("Amount of Students Exceeded, no more than 10");
        }
    }
    public string getClassNumberAndName()
    {
        return "Course Number: " + courseNumber + "   " + " Course Name: " + courseName;
    }
    public override string ToString()
    {
        string classNumberAndName = getClassNumberAndName();
        for(int i = 0; i < students.Length; i++)
        {
            classNumberAndName += ((Student)students[i]).ToString();
        }
        classNumberAndName += "Students Registered: " + numberOfStudents.ToString();
        return classNumberAndName;
    }
}


public class Student
{
    private string idNumber;
    private string name;
    public Student(string ID, string Name)
    {
        idNumber = ID;
        name = Name;
    }
    public override string ToString()
    {
        return "Student ID: " + idNumber + " " + " Student Name " + name;
    }       
}

这是Web代码的.aspx.cs文件。

public partial class WebForm1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            pnlStudent.Visible = false;//use panels to disable the ability to enter new course information
        }
    }
    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        MyClass course = new MyClass(txtCnum.Text, txtCname.Text);
        Session.Add("Course", course);
        ((MyClass)Session["Course"]).addAStudent(new Student(txtCnum.Text, txtCname.Text));//since we entered to Student, course information or student information?

        txtAnswers.Text += course.ToString();

        pnlStudent.Visible = true;
    }
    protected void btnAdd_Click(object sender, EventArgs e)
    {
        Student student = new Student(txtID.Text, txtName.Text);
        pnlCourse.Visible = false;
        try
        {
            ((MyClass)Session["Course"]).addAStudent(new Student(txtID.Text, txtName.Text));
            txtAnswers.Text += Session["Course"].ToString();
        }
        catch(Exception ex)
        {
            txtAnswers.Text += "Amount of students are at maximum." + ex.Message;
        }
    }
}

4 个答案:

答案 0 :(得分:2)

问题出现在这个循环中:

for(int i = 0; i < students.Length; i++)
{
    classNumberAndName += ((Student)students[i]).ToString();
}

您正在使用students = new Student[10]初始化学生,因此即使您插入的students.Length名学生少于1010也会null。您尚未填写的值为null.ToString,因此您最终会执行NullReferenceException,因此numberOfStudents

我相信您应该使用for(int i = 0; i < numberOfStudents; i++) { classNumberAndName += ((Student)students[i]).ToString(); } 代替:

{{1}}

答案 1 :(得分:0)

MyClass.ToString()方法你应该检查数组是否为null,如果是,则打破循环

这里是代码

public override string ToString()

{     string classNumberAndName = getClassNumberAndName();

for (int i = 0; i < students.Length; i++)
{
    if (students[i] == null) break;
    classNumberAndName += ((Student)students[i]).ToString();
}
classNumberAndName += "Students Registered: " + numberOfStudents.ToString();
return classNumberAndName;

}

注意:您必须在addAStudent方法中删除Student [] students = new Student [10]

感谢

答案 2 :(得分:0)

您的Student类可能需要一个空构造函数,用于将ID和Name初始化为默认(空)值。像public Student(){ID = -1; Name = String.Empty}之类的东西 要么 你没有初始化阵列 - 取自微软的网站......

初始化数组

...

注意如果在声明时未初始化数组,则会自动将数组成员初始化为数组类型的默认初始值。此外,如果将数组声明为类型的字段,则在实例化类型时,它将设置为默认值null。

答案 3 :(得分:0)

你有不断长度的学生名单。你通过它枚举,但是我看不到你填充数组中的所有项,所以有你的NullReferanceException。 这将有所帮助:

public override string ToString()
{
    string classNumberAndName = getClassNumberAndName();
    for(int i = 0; i < students.Length; i++)
    {
        if (students[i] != null)
            classNumberAndName += ((Student)students[i]).ToString();
    }
    classNumberAndName += "Students Registered: " + numberOfStudents.ToString();
    return classNumberAndName;
}
相关问题