索引越界c#(我试图添加savegame并使用WriteAllLines)

时间:2017-08-29 20:29:21

标签: c# indexoutofboundsexception

我正在尝试为一个非常简单的游戏制作存档游戏,这是我现在使用的代码,用于将钱写入.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()引用了一个返回所有值的wall类中的方法),使用一系列墙和士兵保存了它们的大小和位置,然后我做了一个savegame:

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转换为字符串)

5 个答案:

答案 0 :(得分:6)

String[] Money = new String[MainForm.Money];

在这里创建MainForm.Money大小的数组。假设MainForm.Money的值为10。 该阵列的大小为10,这意味着有10个插槽。这些编号为0-9。

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

在这里你做了相当于Money [10]的时候它只有9个插槽。因此你去了#34; Out of Bounds&#34;数组。

答案 1 :(得分:2)

简而言之:

数组是从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&#34; slot&#34;的数组时你有从0到4999,因为数组是从0开始的。这就是为什么5000超出界限&#34;

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

    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 :(得分:0)

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

的数组
    strings (x = MainForm.Money).

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

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