c#System.ArgumentOutOfRangeException

时间:2017-08-13 16:35:41

标签: c#

我正在制作发送带有一些数据的电子邮件的程序。我知道System.ArgumentOutOfRangeException异常意味着数组/列表中的数字不存在,但我不知道我编码错误。

这是一段代码:

public void SendMail()
{
    StreamReader sr = new StreamReader(path1);
    var lineCount = File.ReadLines(path1).Count();
    List<string> data = new List<string>();
    for (int i = 0; i < lineCount; i++)
    {
       data[i] = sr.ReadLine(); //Error Comes here.
    }
    string finaldata = data[0] + "/n" + data[1] + "/n" + data[2] + "/n" + data[3] + "/n" + data[4] + "/n" + data[5] + "/n" +       
    data[6] + "/n" + data[7] + "/n" + data[8] + "/n" + data[9] + "/n" + data[10];
    var fromAddress = new MailAddress("tutorialvideohd@gmail.com", "From Name");
    var toAddress = new MailAddress("tutorialvideohd@example.com", "To Name");
    const string fromPassword = "*****";
    string subject = "Some Users Data.";
    string body = finaldata;

    var smtp = new SmtpClient
    {
       Host = "smtp.gmail.com",
       Port = 587,
       EnableSsl = true,
       DeliveryMethod = SmtpDeliveryMethod.Network,
       UseDefaultCredentials = false,
       Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
    };

    using (var message = new MailMessage(fromAddress, toAddress)
    {
        Subject = subject,
        Body = body
    })
    {
        smtp.Send(message);
    }
}

4 个答案:

答案 0 :(得分:1)

执行此操作时,它只创建一个空列表:

List<string> data = new List<string>();

因此,如果您尝试使用索引分配值,则需要尝试将值分配给不存在的值。

相反,您应该Add()如下:

data.Add(sr.ReadLine());

修改

此外,与提出的问题无关,但我没有看到你关闭了你已打开的StreamReader,这总是一种不好的做法。相反,我建议使用using语句来处理StreamReader的开启和关闭。此外,获取lineCount是多余的,您可以利用不需要事先设置列表中项目数的事实来做这样的事情。

List<string> data = new List<string>();
using (StreamReader sr = new StreamReader(path1))
{
    while(!sr.EndOfStream)
        data.Add(sr.ReadLine()); 
}

答案 1 :(得分:0)

首先,你有一个空字符串列表,你不能通过访问索引来填充data,因为那些索引还不存在。您必须使用data.Add(sr.ReadLine())创建新索引并在其中添加值。

string finaldata = data[0] + "/n" + data[1] + "/n" + data[2] + "/n" + data[3] + "/n" + data[4] + "/n" + data[5] + "/n" +       
data[6] + "/n" + data[7] + "/n" + data[8] + "/n" + data[9] + "/n" + data[10];

硬编码ID意味着您需要列表中至少11个项目,如果您的项目较少,它将会中断。为什么不这样做呢?

string finalData = String.Join("/n", data);

这样它就会使用换行符作为分隔符加入你的字符串列表,如果列表中有更多或更少的项目,则无关紧要。

答案 2 :(得分:0)

您正在数组列表中设置尚未初始化的项目。使用抛出异常的以下行。

data.Add(sr.ReadLine());

答案 3 :(得分:-1)

你做了两次同样的事情。

这段代码:

  $query = "INSERT INTO ".$table_name." ".$insertdata;
                if(mysqli_query($conn,$query)){
                    echo "data inserted into DB<br>";                   
                }else{
                   if(mysqli_errno($conn) == 1062)
                       echo "duplicate entry no need to insert into DB<br>";
                   else
                    echo "db insertion error:".$query."<br>";

                }//else end

使用一堆字符串填充列表StreamReader sr = new StreamReader(path1); // ... you had some code here, but not relevant to the point... for (int i = 0; i < lineCount; i++) { data[i] = sr.ReadLine(); //Error Comes here. }

这段代码:

data

使用您尝试填写var lineCount = File.ReadLines(path1).ToList(); 的字符串列表填充lineCount

所以就这样做:

data

摆脱这段代码:

StreamReader sr = new StreamReader(path1);
var lineCount = File.ReadLines(path1).Count();
List<string> data = lineCount;

并注意for (int i = 0; i < lineCount; i++) { data[i] = sr.ReadLine(); //Error Comes here. } 现在如何正确填写。你真的不需要那个data,但是,嘿,我不想重写你的整个身体此时的代码。

重点介绍:阅读文档,尝试了解每个函数调用正在做什么,特别是.NET Framework。