2013-03-14 3 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 = counter на i = 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

Пожалуйста, обновите название вашей конкретной проблемы .. читать [спросить] –

+1

Что полный трассировки стека? * Не * просто сообщение, вся вещь, не скупитесь на детали. – Arran

+0

1. Вы установили любую точку останова и получили неопределенную переменную? 2. где определяется 'counter'? –

ответ

3

Во-первых, вы, кажется, не нужен цикл, поскольку counter собирается из counter в counter.

Во-вторых, я подозреваю, что у вас есть ошибка «один за другим».

Что произойдет, если вы попробуете это?

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

это работает! Большое спасибо!! –

1

Я считаю, проблема в том, что вы пытаетесь получить доступ к элементу в массиве/коллекции, у которого нет экземпляра (почему вы получаете сообщение об ошибке). Счетчик установки 0 работает, потому что student[0] имеет экземпляр Student.

Если вы хотите получить только один элемент, вам не нужен цикл, вы можете получить доступ к student[i] непосредственно, указав индекс массива, то есть 0.

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

Если учащийся является типичным массивом .net или arraylist, ошибка будет связана с индексом вне границ. –

+0

Скорее всего, массив объявлен как ... большой, и что OP пытается получить доступ к существующему индексу, но который еще не назначен. –

+0

@ J.Steen - да, это то, что я пытался объяснить в своем ответе. Я отредактировал, чтобы попытаться прояснить это немного дальше. –

2

Ваша проблема заключается в том, что student[counter] имеет нулевое значение, в то время как student[0] нет, так что я думаю, что ваш counter не выровнен с student массивом.

2

Попробуйте

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

без петли - что будет просто показать последнее среднем в массиве.

+0

Сбой, если 'student.Length == 0' – Nolonar

+0

Хорошая точка ... обновленный ответ –

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

СПАСИБО, но практический курс был дан нам нашим преподавателем, и требовалось написать его с помощью массива объектов ... –