2013-03-14 153 views
-2
private void btnAddStudent_Click(object sender, EventArgs e) 
    { 
     student[counter] = new Student(txtStudentName.Text, txtStudentSurname.Text,  int.Parse(txtExamMark.Text), counter); 
     counter++; 

    } 

    private void btnAverage_Click(object sender, EventArgs e) 
    { 

     for (int i = counter; i <= counter; i++) 
      MessageBox.Show("" + student[i].Average); 
    } 

我的计划是给我的错误:对象引用不设置到对象错误的实例

Object reference not set to an instance of an object.

我只希望循环运行一次只显示最后计算平均。如果我这样做: 即:改变int i = counteri = 0

private void btnAverage_Click(object sender, EventArgs e) 
    { 

     for (int i = 0; i < counter; i++) 
      MessageBox.Show("" + student[i].Average); 
    } 

然后我的程序工作,但它显示在MessageBox多次根据所输入的学生i量,与上次值是正确的平均值。

我用一个叫做Student的类来计算平均值。但这不是问题,因为正在显示正确的平均值。

我能做些什么来解决这个错误?

+1

请您的具体问题,更新您的标题..阅读[问] – 2013-03-14 09:31:43

+1

什么是完整的堆栈跟踪? *不只是消息,整个事情,不要吝啬细节。 – Arran 2013-03-14 09:33:13

+0

1.你有没有设置任何断点并得到未定义的变量? 2.哪里定义了“counter”? – 2013-03-14 09:33:53

回答

3

首先,你似乎并不需要一个循环,因为counter会从countercounter

其次,我怀疑你有一个out-by-one的错误。

如果您尝试此操作,会发生什么情况?

private void btnAverage_Click(object sender, EventArgs e) 
{ 
    if (counter > 0) 
     MessageBox.Show("" + student[counter-1].Average); 
} 
+0

这个作品!非常感谢你!! – 2013-03-14 09:39:15

1

我认为这个问题是因为你试图访问没有实例的数组/集合中的一个项目(为什么你会收到错误)。将计数器设置为0的原因是student[0]的实例为Student

如果你只想得到一个项目,你不需要一个循环,你可以通过传入数组的索引直接访问student[i],即0

MessageBox.Show("" + student[0].Average); 
+1

如果学生是典型的.net数组或阵列列表,则该错误将与超出界限索引相关。 – 2013-03-14 09:38:24

+0

更有可能数组声明为...很大,并且OP正试图访问已存在的索引,但尚未分配该索引。 – 2013-03-14 09:41:41

+0

@ J.Steen - 是的,这是我在我的回答中试图解释的。我编辑过,试图澄清这一点。 – 2013-03-14 09:43:47

2

您的问题是student[counter]为空,而student[0]是不是,所以我想你counter没有正确与student阵列对准。

2

尝试

if (student.Length > 0) 
{ 
    MessageBox.Show("" + student[student.Length - 1].Average) 
} 

没有循环 - 这将只显示数组中的最后平均值。

+0

如果'student.Length == 0'会崩溃 – Nolonar 2013-03-14 09:59:35

+0

好点...更新回答 – 2013-03-14 10:02:49

0

一个不太容易出错的方法是使用一个List<T>而不是数组:

List<Student> students = new List<Student>(); 
private void btnAddStudent_Click(object sender, EventArgs e) 
{ 
    students.Add(Student(txtStudentName.Text, txtStudentSurname.Text, 
       int.Parse(txtExamMark.Text), counter); 
    counter++; 
} 

private void btnAverage_Click(object sender, EventArgs e) 
{ 
    if(students.Any()) 
    { 
     MessageBox.Show("" + students.Last().Average); 
    } 
} 
+0

感谢,但实际是由我们的讲师授予我们的,并且要求使用对象数组编写它... – 2013-03-14 09:54:49

相关问题