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