System.IndexOutOfRangeException 在控制台应用程序中 - 可能基于系统
System.IndexOutOfRangeException in console app - Likely system based
这个对我来说是一个令人费解的问题。我知道这些类型的错误中的大多数是由于试图访问数组边界之外的东西(并且错误也这么说),但它并没有在这里加起来。以下是错误:
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.Mail
和 System.IO
来查看一些文本文件并发送内容的电子邮件。
虽然我知道 post 没有任何代码是不可取的,但我的问题是一个普遍问题。因为我知道它可以在另一个系统上运行(我只是 运行 它在那里),我的问题是什么可能导致这个 behavior/error?
我尝试过的事情:
- 修复.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 文件中。
我不确定,但查看您的代码,IndexOutOfArrayException 可能与以下几行有关:
if (lineSplit[0].ToString() != "header")
{
currentInt = int.Parse(lineSplit[8].ToString().Trim());
}
您似乎没有检查 lineSplit 中是否返回了任何内容。例如,如果您读取的 LogFile 以某种方式被修改并且现在包含一个新行,这将导致 lineSplit[0] 出现问题——或者如果日志被修改并且现在您没有第 9 列值lineSplit[8]
这个对我来说是一个令人费解的问题。我知道这些类型的错误中的大多数是由于试图访问数组边界之外的东西(并且错误也这么说),但它并没有在这里加起来。以下是错误:
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.Mail
和 System.IO
来查看一些文本文件并发送内容的电子邮件。
虽然我知道 post 没有任何代码是不可取的,但我的问题是一个普遍问题。因为我知道它可以在另一个系统上运行(我只是 运行 它在那里),我的问题是什么可能导致这个 behavior/error?
我尝试过的事情:
- 修复.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 文件中。
我不确定,但查看您的代码,IndexOutOfArrayException 可能与以下几行有关:
if (lineSplit[0].ToString() != "header")
{
currentInt = int.Parse(lineSplit[8].ToString().Trim());
}
您似乎没有检查 lineSplit 中是否返回了任何内容。例如,如果您读取的 LogFile 以某种方式被修改并且现在包含一个新行,这将导致 lineSplit[0] 出现问题——或者如果日志被修改并且现在您没有第 9 列值lineSplit[8]