【问题标题】:index out of bounds c# (I'm trying to add savegame and am using WriteAllLines)索引越界c#(我正在尝试添加savegame并且正在使用WriteAllLines)
【发布时间】:2018-02-07 10:13:27
【问题描述】:

我正在尝试为一个非常简单的游戏制作存档游戏,这是我现在用来将钱写入 .txt 文件的代码(NameBox 是用于写入 .txt 文件名称的文本框) :

private void SaveBtn_Click(object sender, EventArgs e)
    {
        String filename = NameBox.Text;
        if (filename == "")
        {
            filename = "New Save";
        }
        filename += ".txt";
        String[] Money = new String[MainForm.Money];
        Money[MainForm.Money] = MainForm.Money.ToString();
        System.IO.File.WriteAllLines(filename, Money);
        Application.Exit();
    }

但是,在

之后的任何行上都会出现索引越界错误
Money[MainForm.Money] = MainForm.Money.ToString();

我也试过这样做:

for (int i = 0; i < MainForm.Money; i++){
    Money[MainForm.Money] = MainForm.Money.ToString();
}

但它在结束体上给了我一个错误(我称之为波浪形括号) 我之前做过一个保存游戏,其中包含一组墙壁和士兵,使用此代码保存他们的大小和位置(wallList[i].ToString() 是指墙壁类中返回所有值的方法):

private void SaveBtn_Click(object sender, EventArgs e)
    {
        String filename = filenametxt.Text;
        if (filename == "")
        {
            filename = "Level";
        }
        filename += ".txt";
        String[] lines = new String[MainForm.wallList.Count + 
        MainForm.soldierList.Count+1];
        for (int i = 0; i < MainForm.wallList.Count; i++)
        {
            lines[i] = MainForm.wallList[i].ToString();
        }
        lines[MainForm.wallList.Count] = "@";
        for (int i = 0; i < MainForm.soldierList.Count; i++)
        {
            lines[i + MainForm.wallList.Count +1] = 
            MainForm.soldierList[i].ToString();
        }
        System.IO.File.WriteAllLines(filename, lines);
        Application.Exit();
    }

如果有人可以帮助我,我将不胜感激! (请向我解释代码的每一部分的含义,例如解释 .ToString() 将 int 转换为字符串)

【问题讨论】:

  • 一个 IndexOutOfBoundsException 意味着您正在尝试访问不存在的集合的一部分。该指数要么太高要么太低。将您的收藏想象成一行人,您试图找到人 X,但没有人 X。更好地理解此异常可能会让您更清楚为什么会发生这种情况。
  • 是的,我知道索引越界异常是什么,我只是不确定它为什么会发生。当我为我提到的结束游戏做存档游戏时发生了这种情况,但我设法通过像我在这里所做的那样玩弄代码来修复它。感谢您的帮助!

标签: c# indexoutofboundsexception


【解决方案1】:

简而言之:

数组是从 0 开始的,所以这个数组访问是个问题:

Money[MainForm.Money] = ... // MainForm.Money-1 would be okay

更详细:

所以我们有这两行导致您的问题:

String[] Money = new String[MainForm.Money];
Money[MainForm.Money] = MainForm.Money.ToString();

假设 MoneyForm.Moneyint - 假设它是 5000: 在这种情况下,您将创建一个字符串数组Money,其中包含 5000 个空槽来存储字符串。

在第二行中,您基本上说您想在数组的第 5000 个元素中将 5000 写为字符串(所以 "5000")。

Money[5000] = "5000";

但是,当您声明一个包含 5000 个“槽”的数组时,您会得到 从 0 到 4999 的数组,因为数组是从 0 开始的。这就是为什么 5000 是“超出范围”的原因

【讨论】:

    【解决方案2】:

    在下面的行中,您将 Money 初始化为 x 数量的数组

        strings (x = MainForm.Money).
    

    然后您尝试从下面的行访问项目 x + 1,这导致了异常。如果你想访问数组的最后一个元素,你应该调用 Money[MainForm.Money - 1]。

        Money[MainForm.Money] = MainForm.Money.ToString();
    

    【讨论】:

      【解决方案3】:

      由于您要填充字符串数组Money 的长度等于MainForm.Money 的值,因此数组的最大可能索引等于MainForm.Money -1 而不是MainForm.Money

          Money[MainForm.Money] = MainForm.Money.ToString(); 
      // you should change the index here to be within the range (0 - MainForm.Money -1) based on your requirements
      

      【讨论】:

        【解决方案4】:
        String[] Money = new String[MainForm.Money];
        

        在这里创建大小为 MainForm.Money 的数组。假设 MainForm.Money 的值为 10。 数组大小为 10,表示有 10 个插槽。这些编号为 0-9。

        Money[MainForm.Money] = MainForm.Money.ToString();
        

        在这里,当它只有最多 9 个插槽时,您执行相当于 Money[10] 的操作。因此,您将进入数组的“越界”。

        【讨论】:

          【解决方案5】:

          您似乎正在初始化一个长度为 Mainform.Money 的数组,该长度从 0 开始到 Mainform.Money - 1,但是当您尝试设置 Money[Mainform.Money] 的值时,您正在设置定义数组之外的值。

          【讨论】:

          • 感谢大家的快速回复!虽然我现在知道问题出在哪里,但谁能告诉我如何解决这个问题?谢谢!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-09
          • 2014-12-05
          • 2016-08-27
          • 2017-05-31
          • 1970-01-01
          • 2015-01-10
          相关资源
          最近更新 更多