C# 我得到一个System.IndexOutOfRangeException

C# 我得到一个System.IndexOutOfRangeException,c#,switch-statement,try-catch,C#,Switch Statement,Try Catch,我的当前代码有问题。我和其他很多人一样在做一个项目,著名的索达克拉特项目。 我不想要任何代码的解决方案,但我想知道为什么我不能用“System.IndexOutOfRangeException”解决这个问题。 当我试图在我的板条箱中添加超过24瓶时,我遇到了这个错误(我为瑞典的评论道歉) 这是我的密码: public void add_soda() { Console.WriteLine("\"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\""); Con

我的当前代码有问题。我和其他很多人一样在做一个项目,著名的索达克拉特项目。 我不想要任何代码的解决方案,但我想知道为什么我不能用“System.IndexOutOfRangeException”解决这个问题。 当我试图在我的板条箱中添加超过24瓶时,我遇到了这个错误(我为瑞典的评论道歉)

这是我的密码:

public void add_soda()
{

    Console.WriteLine("\"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\"");
    Console.WriteLine("|     Choose your beverage!        |");
    Console.WriteLine("|                                  |"); // Välkomnar användaren
    Console.WriteLine("|[1] Pepsi , Soda, 11kr            |");
    Console.WriteLine("|[2] Coca-Cola , Soda, 12kr        |");
    Console.WriteLine("|[3] Coors Light , Beer, 18kr      |");
    Console.WriteLine("|[4] Fiji, Water , 13kr            |");
    Console.WriteLine("|[5] Nocco , Energy drink , 22kr   |");
    Console.WriteLine("|[6] Redbull , Energy drink , 25kr |");
    Console.WriteLine("|                                  |");
    Console.WriteLine("\"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\"");

    //Console.WriteLine("[7] Randomize");                       <---------- Fixa

    int temp = 0;

    while (!int.TryParse(Console.ReadLine(), out temp) || !(temp < 7 && temp > 0)) // Detta är en failsafe, ifall väljaren väljer något som är över 7 eller under 1 kommer följande kod att skrivas ut.
    {
        // Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine("Invalid input, please try again.");
        // Console.ResetColor();
    }   

    switch (temp) // Denna switch statementen kommer låta oss lägga till flaskor i vår crate
    {
        case 1: //Om anändaren skriver in ett tal mellan 1 och 6, kommer följade cases att skriva ut deras WriteLines.
            Console.WriteLine(">>> You choose Pepsi <<<");
            myCrate[numberOfBottles] = new Bottle("Pepsi", "Soda", 11); // Här skapas en läsk med namnet Pepsi som kostar 11kr.
            numberOfBottles++; // Denna funktion gör så att en läsk läggs in i craten varje gång den skapas.
            break;
        case 2:
            Console.WriteLine(">>> You choose Coca-Cola <<<");
            myCrate[numberOfBottles] = new Bottle("Coca-Cola", "Soda", 12);
            numberOfBottles++;
            break;
        case 3:
            Console.WriteLine(">>> You choose Coors Light <<<");
            myCrate[numberOfBottles] = new Bottle("Coors Light", "Beer", 18);
            numberOfBottles++;
            break;
        case 4:
            Console.WriteLine(">>> You choose Fiji <<<");
            myCrate[numberOfBottles] = new Bottle("Fiji", "Water", 13);
            numberOfBottles++;
            break;
        case 5:
            Console.WriteLine(">>> You choose Nocco <<<");
            myCrate[numberOfBottles] = new Bottle("Nocco", "Energydrink", 22);
            numberOfBottles++;
            break;
        case 6:
            Console.WriteLine(">>> You choose Redbull <<<");
            myCrate[numberOfBottles] = new Bottle("Redbull", "Energydrink", 25);
            numberOfBottles++;
            break;
        default:
            //Console.ForegroundColor = ConsoleColor.Red;         // <<<<<-----------------   FIXA
            Console.WriteLine("Invalid choice!");
           // Console.ResetColor;
            break;
    }
    try
    {
        if(numberOfBottles >= 25)
        {   
            Console.WriteLine("The crate is currently full!");
        }
    }
    catch (IndexOutOfRangeException e)
    {
        Console.WriteLine(e.Message);
        throw new ArgumentOutOfRangeException("index paramater is out of range", e);
    }
}
public void add_soda()
{
Console.WriteLine(“\”~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \”);
Console.WriteLine(“选择您的饮料!”);
Console.WriteLine(“| |”);//Välkomnar användaren
控制台。WriteLine(“|[1]百事可乐、苏打、11kr”);
Console.WriteLine(“|[2]可口可乐、苏打水、12kr”);
控制台。WriteLine(“|[3]Coors灯,啤酒,18kr”);
控制台。书写线(“|[4]斐济,水,13kr”);
Console.WriteLine(“|[5]Nocco,能量饮料,22kr”);
Console.WriteLine(“|[6]红牛,能量饮料,25kr”);
Console.WriteLine(“| |”);
Console.WriteLine(“\”~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \”);
//Console.WriteLine(“[7]随机化”);0))//Dettaär en failsafe,如果所有väljaren väljer nå在kommer följande kod att skrivas ut的领导下获得了7个eller中的somärörörörö。
{
//Console.ForegroundColor=ConsoleColor.Red;
Console.WriteLine(“输入无效,请重试。”);
//Console.ResetColor();
}   
开关(温度)//Denna开关声明kommer låta oss lågga直到烧瓶或vår板条箱
{
案例1://Om anändaren skriver在ett tal mellan 1 och 6,kommer följade案例在skriva和deras WriteLines。

Console.WriteLine(“>>>>您选择百事可乐您选择可口可乐您选择Coors Light您选择斐济您选择Nocco您选择红牛您出现的问题是由于您试图访问
瓶子的一部分[]
这是不存在的。由于您已实例化了具有特定长度的数组,因此无法超出该长度。在尝试访问该数组之前,您应该首先(始终)根据数组的
length
属性检查要使用的索引。假设我们有一个
int[]
对于整个示例,我们首先给它一个
长度
3

int[] someNumbers = new int[3];
在上述情况下,我们创建了一个新的
int
数组,分配了
3
个内存插槽。如果我们尝试使用硬编码的数字访问它,问题会变得非常明显:

someNumbers[0] = 1;
someNumbers[1] = 2;
someNumbers[2] = 3;
someNumbers[3] = 4; // Blows up here.
3
的第四个索引不起作用的原因是,在
C#
中,集合是以零为基础的索引访问的;这意味着访问从零开始并从零开始爬升。因此,从技术上讲,元素比您认为的要落后一个空间(如果您习惯于从一开始的传统数字系统)

如果使用相同的主体并使用变量访问数组,同样的情况也会发生,但不太明显;我假设您知道
++
操作符对此做了什么

int index = 0;
int[] someNumbers = new int[3];
someNumbers[index++] = 1; // index = 0
someNumbers[index++] = 2; // index = 1
someNumbers[index++] = 3; // index = 2
someNumbers[index++] = 4; // index = 3 :: Blows up here.
出于完全相同的原因,这在
3
的第四个索引上爆炸。解决这一问题的方法是在访问之前检查索引:

if (index < someNumbers.Length)
    someNumbers[index++] = 1;
在路上的某个地方,出于某种原因,我们决定需要3个以上的数字;好吧,我们现在需要一个更大的数组。要做到这一点(效率非常低),您可以创建一个更大的新数组,只需添加所有旧值:

int[] newNumberArray = new int[someNumbers.Length + 10];
for (int i = 0; i < someNumbers.Length; i++)
    newNumberArray[i] = someNumbers[i];
int[]newnumberraray=newint[someNumbers.Length+10];
for(int i=0;i

上面的代码创建了一个更大的数组,并将所有旧值放入其中。请记住,这是一种非常低效的方法,我强烈建议使用
List
或一些类似的对象。

在我看来,问题是,您在myCrate[]上使用了索引操作符在数组上,其中没有足够的空间

如果您知道阵列中将有7项,请为其创建足够的位置。此代码应如下所示:

myCrate = new Bottle[7];

现在您可以在此数组上使用0到6的索引运算符

移动到使用
列表
而不是数组;您的数组长度在初始化时设置,不重新初始化就无法通过它。添加内容时更容易使用
列表
。现在编写答案。因为您已经创建了
myCrate
a这是一个大小为24的数组(它只能容纳24个元素)Hi Performalj,我还没有掌握足够的关于列表的知识,所以即使它更简单(我已经多次阅读),我想知道是否还有其他错误保险柜可以尝试?而且,我们没有(!)允许使用列表。抱歉,我删除了我以前的评论。请注意数组索引是从零开始的。因此,对于24元素数组,有效索引为0,…,23。您使用
numberoflabels
作为数组索引,因此您应该测试
numberoflabels
是否变为24或更大(表示数组已满)。或者,如果您想以
numberoflabels=1
作为第一个瓶子的开头,请使用
numberoflabels-1
作为数组索引。@elgonzo索引
numberoflabels
应该与数组的
长度进行比较。在所有情况下,它都应该小于
长度
。谢谢。我会尝试调整代码,以便首先,我可以应用检查。非常感谢J!0-7是8个索引,而不是7。因此,如果你需要一个7的数组,那么你需要
新瓶子[7]
,索引是0-6。你是对的,我以为他在代码[7]中写的,但不是。我修正了我的答案,然后是Thx$
myCrate = new Bottle[7];