2013-03-14 4 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 다음

private void btnAverage_Click(object sender, EventArgs e) 
    { 

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

i = 0 내 프로그램의 작동을 변경하지만 마지막 값이 올바른 평균 인 상태, 입력 학생들 i의 양에 따라 메시지 박스를 여러 번 표시합니다.

평균을 계산하려면 Student이라는 클래스를 사용했습니다. 그러나 올바른 평균이 표시되기 때문에 이는 문제가되지 않습니다.

이 오류를 해결하려면 어떻게해야합니까?

+1

는 –

+1

전체 스택 추적은 무엇입니까 읽기 [질문] ... 특정 문제에 제목을 업데이트하세요? * 메시지가 아니라 단지 모든 것이 세부 사항에 대해 설명하지 않습니다. – Arran

+0

1. 중단 점을 설정하고 정의되지 않은 변수를 가져 왔습니까? 2. '카운터'가 정의 된 곳? –

답변

3

첫째, 당신은 counter에서 counter에가는 counter 때문에 루프를 필요로 표시되지 않습니다.

둘째, 나에게 하나씩 오류가 있다고 의심됩니다.

이 방법을 사용하면 어떻게됩니까?

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

이 작품! 대단히 감사합니다 !! –

1

문제가있는 이유는 인스턴스가없는 배열/컬렉션의 항목 (왜 오류가 발생했는지)에 액세스하려고하기 때문입니다. student[0]의 인스턴스가 Student이므로 0으로 카운터를 설정하면됩니다.

하나의 항목 만 얻고 싶다면 루프가 필요하지 않습니다. 0과 같이 배열의 색인을 직접 입력하여 student[i]에 액세스 할 수 있습니다.

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

학생이 전형적인 .net 배열이나 arraylist 인 경우 오류는 범위를 벗어난 색인과 관련이 있습니다. –

+0

오히려 배열이 오히려 큰 것으로 선언되고 OP가 기존 인덱스에 액세스하려하지만 아직 할당되지 않았을 가능성이 높습니다. –

+0

@ J.Steen - 네, 그게 제가 대답에서 설명하려고했던 것입니다. 나는 이것을 조금 더 명확히하려고 편집했다. –

2

귀하의 문제는 student[0]가 아닌 동안 student[counter]가 null이다, 그래서 당신의 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

감사합니다. 실용적인 것은 강사가 우리에게 주었고 요구 사항은 객체 배열을 사용하여 작성하는 것이 었습니다 ... –