2015-02-03 7 views
0

이 프로그램을 실행하는 동안 널 예외 오류가 발생했습니다. 내가 배열을 배열의 크기를 변경배열 초기화 후 null 참조 예외가 발생합니다.

public class student 
{ 
    string name; 

    public string _name 
    { 
     set 
     { 

      this.name = value; 
     } 
     get 
     { 
      return name; 
     } 
    } 
    public int _marks{ set; get; } 
} 

student[] arr = new student[3]; 

arr[0] = new student(); 
arr[0]._name = "AB"; 
arr[0]._marks = 44; 

arr[1] = new student(); 
arr[1]._name = "amla"; 
arr[1]._marks = 75; 


foreach (student i in arr) 
{ 
    Console.WriteLine("\nname:{0}\nmarks:{1}", i._name, i._marks); 
} 
Console.Read(); 
+1

: 장소에두고

public class Student { private string _name; public string Name { get { return _name; } set { if (value != null) _name = value; } } public int Marks { get; set; } public Student() { Name = "<No Name>"; } public override string ToString() { return string.Format("{3}Name:{0}{3}Marks:{1}", Name, Marks, Environment.NewLine)); } } 

, 당신은 다음과 같은 간단한 일을 할 수 있습니다 예외? –

+0

을 컴파일 한 후에 출력을 표시하지만 출력 핸들이 정확합니다. – dinoos

+0

예외가 어디에서 발생하는지 알려주지 않습니다. 코드에서 어떤 라인이 예외를 던지는지 파악하는 방법을 배워야합니다. –

답변

0

에 한번 초기화 가지고 있지만 :

student[] arr = new student[2]; 
0

을 당신은 3의 크기와 배열을 가지고 있지만, 당신은 단지 두 요소를 추가합니다.

변경

student[] arr = new student[3]; 

당신이 초기화되지 않은 경우 student 클래스의 멤버에 액세스하려고 때문에이 문제가 발생
student[] arr = new student[2]; 

에.

위에서 말한 것처럼 할 수도 있고 3 번째 학생을 추가 할 수도 있습니다.

+1

L33TS & Zaitsman 덕분에 ... – dinoos

1

정확히 어디에서 오류가 발생했는지 알려주지는 않았지만 게시 한 코드는 arr[0]arr[1]으로 초기화되었지만 결코 arr[2]으로 초기화되지 않았습니다.

세 개의 요소가있는 배열을 할당 했으므로 세 개의 요소 모두 루프 끝에서 액세스됩니다.

따라서 마지막 요소의 속성에 액세스하려고하면 null 참조 예외가 발생할 것으로 예상됩니다.

+0

다음 줄에 배열이 있습니다. Console.WriteLine ("\ nname : {0} \ nmarks : {1}", i._name, i._marks); 예, 이제 배열의 크기를 변경해야합니다. – dinoos

1

배열 크기는 3이지만 배열에 2 개의 요소 만 초기화했습니다. arr [0]과 arr [1]에 요소가있는 반면 arr [2]는 초기화 된 데이터가 없으므로 null 참조를 반환합니다. 당신은 당신이 (

student[] arr = new student[2]

1

당신이 당신의 루프에서 널 학생의 속성에 액세스를 시도하고 있기 때문에 당신은 NullReferenceException을 받고를 사용하여 [2], 언 2로 배열의 크기를 변경하는 데이터를 추가 할 수 있습니다 처음 두 개만 초기화했으나 마지막 두 개는 초기화하지 않았습니다). 당신이 항목의 일부를 초기화하지 않은, 그래서 만약이 예외를 피하기 위해

한 가지 방법은 초기화 된 학생들의 이름을 출력 여전히 수, 루프에서 널 체크를하는 것입니다 :

foreach (student i in arr.Where(s => s != null)) 
{ 
    Console.WriteLine("\nname:{0}\nmarks:{1}", i._name, i._marks); 
} 

은 또한 단지 같은 사실 (널 이름을 확인하여) 이름이 학생들을 보여줄 수 :

foreach (student i in arr.Where(s => s != null && s._name != null)) 
{ 
    Console.WriteLine("\nname:{0}\nmarks:{1}", i._name, i._marks); 
} 

하지만 실제로 이런 일이 아마 학생 클래스 자체에서 수행해야하므로 클라이언트가 아무튼 그럴 필요 없어. 학생 클래스의 name에 대한 기본값을 설정하는 것을 고려할 수 있습니다. 설정되어 있지 않은 경우 (예 : "No Name"과 같은) 계속 표시 할 수 있으며 학생 클래스가 방법을 알 수 있도록 ToString() 메소드를 덮어 쓸 수도 있습니다. 제대로 표시됩니다.당신이 그것에있는 동안 그리고, 클래스와 공용 속성은 일반적으로 C#으로 PascalCase 있습니다 : 당신이받을 수 있나요

foreach (student i in arr.Where(s => s != null)) 
{ 
    Console.WriteLine(i); 
} 
관련 문제