控制台应用程序中的System.IndexOutOfRangeException - 基于可能的系统

控制台应用程序中的System.IndexOutOfRangeException - 基于可能的系统

问题描述:

这是我的一个令人费解的问题。我知道大多数这些类型的错误都是来自尝试访问数组边界之外的东西(并且错误也是这样),但它不会在这里累加起来。以下是该错误:控制台应用程序中的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

什么是索引,以及该数组有多长...... –

我不知道,但看着你的代码,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的检查修复了它。谢谢,这会教我不要发布我的代码! –