2012-09-20 41 views
0

我已經爲我的ASP.NET類創建了一個程序來創建一個類名和數字,然後輸入十個學生名稱和學號。因此,我的網頁將提示用戶輸入這4個信息片段,將它們分爲MyClass(課程名稱和編號)學生課程(其中包含學生姓名和編號)。我非常卡住NullReferenceException錯誤,不知道該怎麼做。如果任何人在這裏可以給我一些指示和方向,所以我可以從這個任務中挑選自己。有一點是肯定的,我是不允許輸入任何新的方法和變量。我只能使用我已初始化的當前的那些。初學者的頭痛:來自ASP.NET web上的數組的NullReferenceException

  • Student []數組是我的Student類包含學生的姓名和ID的數組。
  • 用戶首先將創建班級編號和姓名,以便在之後向其添加學生(帶有ID和姓名)。
  • 只允許一個班級名稱和號碼(他們一起出發),最多隻有10名學生。 。

我得到空例外,在我的ToString()在MyClass的方法,其中classNumberAndName + =((學生)的學生[1])的ToString();

這是我的代碼,沒有語法錯誤。

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

請講清楚,你所得到的例外(最好是使樣品小得多5-7lines通常是不夠的)。另外「謝謝你的提示」是不需要的,因爲它們不會添加任何信息(改爲upvote/comment/accept)。 –

+0

好吧,我剛剛添加了「我得到我的ToString()方法在MyClass中的空例外classNumberAndName + =((Student)students [i])。ToString();」我猜你需要看到的是MyClass和aspx.cs文件。我擔心我沒有正確構建陣列。 – GivenPie

回答

2

的問題是在這個循環:

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

您與students = new Student[10]初始化學生,讓students.Length10即使您已插入小於10學生。你沒有填寫的值是null,所以你最終會做null.ToString,因此NullReferenceException

我相信你應該使用代替:

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

哦,我的天哪!你的權利。 – GivenPie

0

MyClass.ToString(),你應該檢查數組是否爲空,如果是,那麼打破循環

這裏的代碼

public override string ToString() 

{ 串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; 

}

注意:您必須刪除學生[]學生=新的學生[10] addAStudent方法

感謝

+0

NullReferenceException是MyClass中的ToString()方法,其中classNumberAndName + =((Student)students [i])。ToString();我也嘗試從addAStudent中刪除Student []學生,然後限制我的私人學生[]學生=新學生[10]。我仍然得到NullReferenceException – GivenPie

0

您可能需要一個空的構造爲您Student類將ID和名稱初始化爲默認(空)值。像公共學生(){ID = -1;名稱=的String.Empty}
OR 你沒有初始化數組 - 從微軟的網站採取...

初始化數組

....

注意如果在聲明時未初始化數組,則陣列成員會自動初始化爲數組類型的默認初始值。另外,如果將數組聲明爲某個類型的字段,則在實例化該類型時,它將設置爲默認值null。

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; 
}