【问题标题】:System.IndexOutOfRangeException in console app - Likely system based控制台应用程序中的 System.IndexOutOfRangeException - 可能基于系统
【发布时间】:2018-03-27 22:57:49
【问题描述】:

这对我来说是一个令人费解的问题。我知道大多数这些类型的错误是由于试图访问数组边界之外的东西(错误也说明了这一点),但它并没有在这里加起来。以下是错误:

System.IndexOutOfRangeException:索引超出范围 Program.cs 中 MyProgram.Program.Main(String[] args) 处的数组:第 47 行

这里唯一的问题是我的程序的第一行在第 47 行(它只定义了一个 MailAddress 变量)。如果我注释掉该行,则第二行错误,即定义 SMTP 客户端。直到昨天,在过去两个月左右的时间里,每天早上都会运行同样的程序。在此期间,我没有更改代码、重新编译或对其进行任何操作(尽管从那以后我尝试了一些调试以在它崩溃后弄清楚)。

程序本身非常简单,它只是使用System.Net.MailSystem.IO 来查看一些文本文件并发送内容的电子邮件。

虽然我知道不建议在没有任何代码的情况下发布,但我的问题是一般性的。由于我知道它可以在另一个系统上运行(我只是在那里运行它),我的问题是什么可能导致这种行为/错误?

我尝试过的事情:

  • 修复.NET Framework 4.5.2(程序上的目标Framework为4.5)。
  • 尝试重新编译 x64(以前是 x86)。
  • 重新启动(显然,只是想指出这一点)。
  • 禁用 Windows 防火墙进行测试(不太可能是因为错误)。

我这里有什么明显的遗漏吗?

编辑:

        static void Main(string[] args)
    {

            MailAddress sendEmailFromNice = new MailAddress("email@email.com", "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 文件中。

【问题讨论】:

  • 向我们展示代码
  • 请分享一些代码以通过。
  • 索引是多少,数组有多长...
  • 显示代码..
  • 添加了代码,但是不管 Main() 的第一行是什么,它都会出错。

标签: c# arrays arguments main indexoutofrangeexception


【解决方案1】:

我不确定,但是查看您的代码,IndexOutOfArrayException 可能与以下几行有关:

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

您似乎没有检查 lineSplit 中是否返回了任何内容。例如,如果您读取的 LogFile 以某种方式被修改并且现在包含一个新行,则会导致 lineSplit[0] 出现问题 - 或者如果日志被修改并且现在您没有第 9 列的值线分割[8]

【讨论】:

  • 我也想过同样的事情。您会期望错误出现在该行上,但事实并非如此。该文件(我手动检查)也没有改变结构。
  • 有时错误行并不总是在代码的确切行中,如果它已经过优化,所以我通常在方法边界内查看(在本例中为'Main')。你能在里面放一个断点来调试吗?或者,如果您添加检查以确保 lineSplit 确实包含您想要的索引,会发生什么? -- (即:添加一个检查,如 ---- if (lineSplit.Count() >= 9 && lineSplit[0].ToString() != "header") ---- )
  • 哇哦!那行得通。很抱歉所有的混乱,显然在文件的某个地方有一行格式不正确(这是第一次发生)。我得看看那是什么,但与此同时,检查以确保它的计数为 9 已修复它。非常感谢,这将教会我不要发布我的代码!
猜你喜欢
  • 1970-01-01
  • 2010-10-19
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多