2013-11-21 15 views
0

문자열을 정수로 변환하는 데 문제가 있습니다. Ive는 주변을 둘러 보았고 int.Parse을 사용하라는 말을 들었지만 도움이되지 않습니다.streamreader를 사용할 때 string을 int로 변환 할 수 없습니다.

나는 int WinnerScorestring WinnerName을 가진 객체 Winner을 만들었습니다. 배열을 정렬하기 전에이 값을 배열 Winner[]에 추가하려고합니다.

이 코드를 실행하면 말한다 :

는 NullReferenceException이 처리되지 않은 개체의 인스턴스로 설정되지 않았습니다

개체 참조했다.

왜 이런 일이 발생하는지 알고 싶습니다. 난 당신이 배열 unsortedList을 선언하지만 당신은 당신이 그 배열에 저장할 수상작 클래스의 객체를 초기화하지 않은 것으로 가정 할 수있는 특정 신뢰와

StreamReader sr = new StreamReader("highscores.txt"); 

for (int u = 0; u < nWinners; u++) 
{ 
    unsortedList[u].WinnerScore = int.Parse(sr.ReadLine()); 
    unsortedList[u].WinnerName = sr.ReadLine(); 
} 
sr.Close(); 
+4

선언과'unsortedList' – Steve

+1

어떻게 당신이 당신의 unsortedList 배열을 초기화 할의 초기화를 추가하세요? <0, nWinners>의 일부 U에 대해서는 unsortedList [u] = null 인 것처럼 보입니다. – decPL

답변

2

. 그들은 모두 null이 가능한 100 개 슬롯의 우승자 클래스의 인스턴스가없고, 간단하게

Winner[] unsortedList = new Winner[100]; 

를 선언

우승자의 100 개 인스턴스를 저장할 수있는 배열을 생성하지만,이 배열은 비어 있습니다. 배열의 100 슬롯에 저장하려는 모든 Winner 인스턴스를 하나씩 생성해야합니다.

그래서, 예를 들어, 코드가

그러나
Winner[] unsortedList = new Winner[nWinners]; 
using(StreamReader sr = new StreamReader("highscores.txt")) 
{ 
    for (int u = 0; u < nWinners; u++) 
    { 
     Winner w = new Winner(); 
     w.WinnerScore = int.Parse(sr.ReadLine()); 
     w.WinnerName = sr.ReadLine(); 
     unsortedList[u] = w; 
    } 
    sr.Close(); 
} 

로 다시 작성할 수 있습니다, 이것은 당신이 알아야하는 단점이있다, 루프에 들어가기 전에, 우승자 객체의 정확한 수는 치수를 요구하여 array, 어떤 이유로 든 정확하게 계산하지 못하면 다른 문제 (Index Out of Range)에 빠지게됩니다. 이 경우

은 당신이 손 전에 알고 당신은 초기화뿐만 아니라 생성을 떠 났어요

List<Winner> unsortedList = new List<Winner>(); 
using(StreamReader sr = new StreamReader("highscores.txt")) 
{ 
    while((line = sr.ReadLine()) != null)) 
    { 
     Winner w = new Winner(); 
     w.WinnerScore = int.Parse(line); 
     w.WinnerName = sr.ReadLine(); 
     unsortedList.Add(w); 
    } 
    sr.Close(); 
} 
0
var unsortedList = new List<Winner>(); 

var nWinners = 100; 
using (StreamReader sr = new StreamReader("highscores.txt")) 
{ 
    for (int i = 0; i < nWinners; i++) 
    { 
     var winer = new Winner(); 
     winer.WinnerScore = int.Parse(sr.ReadLine()); 
     winer.WinnerName = sr.ReadLine(); 
     unsortedList.Add(winer); 
    } 
    sr.Close(); 
} 
0

요소의 정확한 수를 필요로하지 않는 곳에 List<Winner>를 사용하는 것이 더 좋다 :

// My suggestion of unsortedList generic type 
public struct Winner { 
    public int WinnerScore; 
    public String WinnerName; 
} 

... 

// 1. You shoud create unsortedList: 
List<Winner> unsortedList = new List<Winner>(); 

// 2. You should also initialize the list with Winner instances 
for (int u = 0; u < nWinners; ++u) 
    unsortedList.Add(new Winner()); 

// 3. Only that you can fill unsortedList from file. 
// And you original code becames the correct one 
using (StreamReader sr = new StreamReader("highscores.txt")) { 
    for (int u = 0; u < nWinners; ++u) { 
    unsortedList[u].WinnerScore = int.Parse(sr.ReadLine()); 
    unsortedList[u].WinnerName = sr.ReadLine(); 
    } 
} 
관련 문제