我为我的ASP.NET类创建了一个程序来创建一个类名和编号,然后输入十个带有学生ID的学生姓名。因此,我的网页将提示用户输入这4个信息片段,将它们分成 MyClass(课程名称和编号)和学生班级(其中包含学生姓名和ID) 即可。我非常关注NullReferenceException错误,并且不知道该怎么做。如果有人在这里可以给我一些指示和方向,那么我可以从这项任务中挑选自己。有一件事是肯定的,我不允许输入任何新的方法和变量。我只能使用我初始化的当前文件。
我在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;
}
}
}
答案 0 :(得分:2)
问题出现在这个循环中:
for(int i = 0; i < students.Length; i++)
{
classNumberAndName += ((Student)students[i]).ToString();
}
您正在使用students = new Student[10]
初始化学生,因此即使您插入的students.Length
名学生少于10
,10
也会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;
}