2014-03-06 3 views
-2

색인 배열이 잘못되었다고 말하는 오류가 발생하지만 잘못된 것을 잘 모릅니다. Visual Studio에서 오류로 강조 표시된 행을 주석 처리했습니다. ReadData() 방법에서 발생합니다. 어떤 조언을 주셔서 감사합니다. 타입 'System.IndexOutOfRangeException'처리되지 않은 예외 Lab3.exe 추가 정보 발생텍스트 파일에서 읽으려고 할 때 인덱스가 배열에서 벗어나고 int32.tryparse

형 'System.IndexOutOfRangeException'의 첫 번째 예외가 발생 Lab3.exe : 인덱스 배열의 범위를 벗어난 . '[9140] Lab3.vshost.exe : Managed (v4.0.30319)'프로그램이 코드 0 (0x0)으로 종료되었습니다.

class Program 
{ 
    private const int MAX_MEDIA_OBJECTS = 100; // Max number of array objects 
    private int mediaCount = 0; // Counter to keep track of amount of media in Data.txt 

    private Media[] media = new Media[MAX_MEDIA_OBJECTS]; 

    private Song[] songs = new Song[MAX_MEDIA_OBJECTS]; 
    private Movie[] movies = new Movie[MAX_MEDIA_OBJECTS]; 
    private Book[] books = new Book[MAX_MEDIA_OBJECTS]; 

    static void Main(string[] args) 
    { 
     Program lab3 = new Program(); 

     bool didUserExit = false; 

     int userSelectedOption; 

     lab3.ReadData(); 

     do // Do While loop for the options menu, exits when the user selects the exit option. 
     { 
      lab3.DisplayOptions(); 
      string userInput = Console.ReadLine(); 

      if (int.TryParse(userInput, out userSelectedOption)) 
      { 
       lab3.ProcessSelectedInput(userSelectedOption, lab3); 
      } 
      else 
      { 
       lab3.DisplayErrorMessage(); 
      } 

      Console.WriteLine("Press any key to continue..."); 
      Console.ReadKey(); 

     } while (!didUserExit); 
    } 

    public void ReadData() 
    { 
     // Opens the Data.txt file for read access 
     FileStream mediaFile = new FileStream("Data.txt", FileMode.Open, FileAccess.Read); 
     StreamReader mediaData = new StreamReader(mediaFile); 

     string mediaRow; // Holds each media data per row 

     while ((mediaRow = mediaData.ReadLine()) != null) 
     { 
      // Splits each row with the delimiter 
      string[] mediaDataSplit = mediaRow.Split('|'); 

      // Temporary variables to hold media data 
      int year; 


      /** ERROR HAPPENS HERE ACCORDING TO VISUAL STUDIO IDE */ 
      bool didConvert = Int32.TryParse(mediaDataSplit[2].Trim(), out year); 

      if (!didConvert) 
      { 
       Console.WriteLine("Improperly formated field at line {0}", mediaCount + 1); 
       Environment.Exit(0); 
      } 

      if (didConvert) 
      { 
       Console.WriteLine("trace year {0}", mediaDataSplit[2]); 
      } 

      mediaCount++; 
     } 
    } 

    public void ProcessSelectedInput(int userSelectedOption, Program labReference) 
    { 
     switch (userSelectedOption) 
     { 
      case 1: 
       Console.WriteLine("case1"); 
       break; 
      case 2: 
       Console.WriteLine("case2"); 
       break; 
      case 3: 
       Console.WriteLine("case3"); 
       break; 
      case 4: 
       Console.WriteLine("case4"); 
       break; 
      case 5: 
       Console.WriteLine("case5"); 
       break; 
      case 6: 
       Environment.Exit(0); 
       break; 
      default: 
       labReference.DisplayErrorMessage(); 
       break; 
     } 
    } 

    public void DisplayOptions() 
    { 
      Console.Clear(); 

      Console.WriteLine("1. List All Books"); 
      Console.WriteLine("2. List All Movies"); 
      Console.WriteLine("3. List All Songs"); 
      Console.WriteLine("4. List All Media"); 
      Console.WriteLine("5. Search All Media by Title"); 
      Console.WriteLine(""); 
      Console.WriteLine("6. Exit Program"); 
      Console.WriteLine(""); 
      Console.Write("Enter choice: "); 
    } 

    public void DisplayErrorMessage() 
    { 
     Console.WriteLine("*** Invalid Choice - Try Again ***"); 
    } 
} 
+6

http://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – SLaks

+0

질문이 구체적이지 않고 오류가 발생한 부분에 대한 세부 정보가 너무 적습니다. 최소한 stacktrace를 포함하십시오. –

+0

SLak이 게시 한 링크를 실제로 확인해야합니다. 작고 간단한 프로그램을 디버그 할 수 없다면 배열이 범위를 벗어난 것보다 훨씬 심각한 문제가 있습니다. –

답변

4

오류는 아마 여기에 무슨 일이 일어나고 : 결과로 mediaDataSplit[2]

을 여기에 그것을 얻을 때부터 : string[] mediaDataSplit = mediaRow.Split('|');

무엇 이건이 많은이없는에서 찾고 라인 "|" 문자가 예상대로이므로 배열을 크게 만들지 않습니다.

실패한 경우 mediaRow의 값이 무엇인지 확인해야합니다.

3

mediaDataSplit에는 3 개 미만의 요소가 포함되어 있거나 비어 있습니다. 세 번째 요소에 액세스하기 전에 당신이 요소가 존재하는지 여부를 확인할 수 있습니다

if(mediaDataSplit.Length >= 3) 
    bool didConvert = Int32.TryParse(mediaDataSplit[2].Trim(), out year); 
관련 문제