【问题标题】:file loading error文件加载错误
【发布时间】:2011-08-13 06:31:11
【问题描述】:

好的,我正在尝试通过 C# 加载一堆配置文件,当我尝试启动程序时不断收到此错误。

C:\C#FILES>program.exe

Unhandled Exception: System.IndexOutOfRangeException: Index was outside the boun
ds of the array.
   at ConsoleApplication2.Program.loadAccounts()
   at ConsoleApplication2.Program.Main(String[] args)

C:\C#FILES>

我已经调查过,我认为这与文件中帐户的格式有关 我想知道正确的方法是什么,我已经尝试了所有我能想到的方法

这是加载帐户的方法

private static void loadAccounts()
{
    using (TextReader tr = new StreamReader("accounts.txt"))
    {
        string line = null;
        while ((line = tr.ReadLine()) != null)
        {
            String[] details = line.Split('\t');
            accounts.Add(details[0] + ":" + details[1]);
        }
    }
}

accounts.txt 部分是我不确定的部分,我认为应该如下 用户名(标签)密码 像这样

username    password

但是它给出了上面显示的错误 有谁知道正确的帐户格式应该是什么?

【问题讨论】:

  • 我遗漏了一些东西...您是否在编辑器中检查过文件? details[0] 或 details[1] 都不存在。数据在读取文件时是否以格式实际存在?一边走一边打印线怎么样,这样你就知道是哪一条了?

标签: c# arrays indexing user-accounts


【解决方案1】:

您得到一个 IndexOutOfRangeException,这表明 details 只有一个条目 - 这意味着该行上没有选项卡。

我建议您在拆分之前打印出有问题的行,这样您就可以看到是哪一行导致了问题。或者可能有条件地这样做:

while ((line = tr.ReadLine()) != null)
{
    String[] details = line.Split('\t');
    if (details.Length == 1)
    {
        // Or log it, or whatever...
        Console.WriteLine("Input error: no tab in line '{0}'", line);
    }
    else
    {
        accounts.Add(details[0] + ":" + details[1]);
    }
}

【讨论】:

    【解决方案2】:

    这是因为您从输入中拆分出来的行不包含请求的元素。

    由于 .NET 处理 Split 的方式,数组中的第一个(读取:0th)元素不太可能是问题的原因。

    您是否检查过输入文件中没有空行?一个空行(即使在文件末尾)也会导致此问题。

    您可以添加多项检查,例如..

    if(!string.IsNullOrWhitespace(line)) ...
    

    if(details.Length > 1)
    

    这些是一些检查,我建议实施其中一个或两个(还有更多需要考虑),否则你只是盲目地相信输入值,这通常不是一个好的做法。

    【讨论】:

      猜你喜欢
      • 2011-11-09
      • 2012-04-08
      • 2016-11-09
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 2013-09-05
      • 2017-05-13
      相关资源
      最近更新 更多