2017-10-16 92 views
1

這是我的一個令人費解的問題。我知道大多數這些類型的錯誤都是來自嘗試訪問數組邊界之外的東西(並且錯誤也是這樣),但它不會在這裏累加起來。以下是該錯誤:控制檯應用程序中的System.IndexOutOfRangeException - 基於可能的系統

System.IndexOutOfRangeException: Index was outside the bounds of the array at MyProgram.Program.Main(String[] args) in Program.cs:line 47

這裏是我的程序的第一行是在第47行(這只是限定MailAddress變量)唯一的問題。如果我註釋掉該行,則會發現第二行錯誤,它定義了SMTP客戶端。直到昨天,這個程序在過去兩個月左右每天早上都在運行。在過渡期間,我沒有改變代碼,重新編譯或做了任何事情(儘管從那以後我已經嘗試過一些調試,以便在破壞後找出它)。

該程序本身非常簡單,它只是使用System.Net.MailSystem.IO來查看一些文本文件併發送內容的電子郵件。

我的問題,雖然我知道不建議發佈沒有任何代碼,是一個普遍的問題。因爲我知道它在另一個系統上工作(我只是在那裏運行它),我的問題是什麼可能導致此行爲/錯誤?

事情我已經嘗試:

  • 修復的.NET Framework 4.5.2(關於該程序的目標框架是4.5)。
  • 嘗試重新編譯x64(之前是x86)。
  • 重新啓動(顯然,只是想指出)。
  • 禁用Windows防火牆進行測試(不太可能是因爲錯誤)。

這裏有什麼明顯的我失蹤了嗎?

編輯:

 static void Main(string[] args) 
    { 

      MailAddress sendEmailFromNice = new MailAddress("[email protected]", "Nice Email Name"); 
      SmtpClient client = new SmtpClient(); 
      client.Port = smtpport; 
      client.Host = smtphost; 
      client.EnableSsl = true; 
      client.Timeout = 25000; 
      client.DeliveryMethod = SmtpDeliveryMethod.Network; 
      client.UseDefaultCredentials = false; 
      client.Credentials = new NetworkCredential(sendEmailFrom, sendEmailFromPass); 

      ServicePointManager.ServerCertificateValidationCallback = delegate (object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
      { return true; }; 

      // gotten list 
      List<int> alreadyGottenList = new List<int>(); 
      string line = null; 
      string[] lineSplit = null; 
      int currentInt = 0; 
      if (File.Exists(storedIntList)) 
      { 
       using (var reader = new StreamReader(storedIntList)) 
       { 
        line = null; 
        while ((line = reader.ReadLine()) != null) 
        { 
         currentInt = int.Parse(line.Trim()); 
         alreadyGottenList.Add(currentInt); 
         currentInt = 0; 
        } 
       } 
      } 

      List<int> newIntsToGet = new List<int>(); 
      if (File.Exists(LogFile)) 
      { 
       using (var readerPrimaryToday = new StreamReader(LogFile)) 
       { 
        while ((line = readerPrimaryToday.ReadLine()) != null) 
        { 
         lineSplit = line.Split(','); 

         if (lineSplit[0].ToString() != "header") 
         { 
          currentInt = int.Parse(lineSplit[8].ToString().Trim()); 
         } 
         if (!alreadyGottenList.Contains(currentInt)) 
         { 
          newIntsToGet.Add(currentInt); 
          alreadyGottenList.Add(currentInt); 
          File.AppendAllText(storedIntList, currentInt.ToString() + Environment.NewLine); 
         } 
        } 
       } 
      } 

    string emailBody = "BodyHere "; 
    string emailSubject = "Subject here"; 

    foreach (var thisVar in newIntsToGet) 
    { 
     emailBody = emailBody + thisVar.ToString() + Environment.NewLine; 
    } 

    MailMessage messageToSend = new MailMessage(); 
    messageToSend.Subject = emailSubject; 
    messageToSend.Body = emailBody; 
    messageToSend.IsBodyHtml = false; 

    messageToSend.To.Add(sendEmailTo); 
    client.Send(messageToSend); 
} 

它只是用數字.csv文件,然後檢查我還沒有看到任何號碼的文本文件。如果找到一個,它會將其添加到電子郵件和存儲的.csv文件中。

+3

告訴我們代碼 – Baksteen

+1

請分享一些代碼來通過。 –

+0

什麼是索引,以及該數組有多長...... –

回答

2

我不知道,但看着你的代碼,IndexOutOfArrayException可以與以下行相關:

if (lineSplit[0].ToString() != "header") 
{ 
    currentInt = int.Parse(lineSplit[8].ToString().Trim()); 
} 

你似乎沒有檢查是否有在lineSplit返回任何東西。例如,如果您讀取的LogFile以某種方式被修改,並且現在包含一個新行,則會導致lineSplit [0]的問題 - 或者如果日誌被修改,並且現在沒有第9列值lineSplit [8]

+0

我曾經想過同樣的事情。你會期望這個錯誤在那一行,但事實並非如此。該文件(我手動檢查)也沒有改變結構。 –

+1

有時,如果錯誤行已經被優化,它並不總是在代碼的確切行中,所以我通常在方法邊界內(在這種情況下是'Main')。你可以在那裏設置一個斷點來進行調試嗎?或者,如果您添加一個檢查以確保lineSplit包含您想要的索引,會發生什麼情況? - (即:添加一個檢查,如---- if(lineSplit。Count()> = 9 && lineSplit [0] .ToString()!=「header」)----) – hsoesanto

+0

哦哇!這工作。對於所有的混淆,很抱歉,顯然文件中有一行是錯誤地形成的(它是第一次發生)。我將不得不看看那是什麼,但在此期間,確保它有一個數字爲9的檢查修復了它。謝謝,這會教我不要發佈我的代碼! –

相關問題