C# - IndexOutOfRangeException未处理

时间:2015-10-23 11:50:35

标签: c#

我正在学校做一个过去的纸质问题,以调整一些伪代码,检查输入的ISBN号是否有效,进入C#。我输入了代码,但它抛出了IndexOutOfRangeException错误。我不确定该错误是如何发生的,因为这是我第一次使用int数组。

我检查了索引不是负数,我认为列表中的最大索引小于列表大小(我尝试更改"计数< 13"在for循环中&#34 ;计数< = 12",但无效)。

 using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

namespace ISBNExercise
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] ISBN;
            int Count;
            ISBN = new int[13];
            for(Count = 0; Count < 13; Count++)
            {
                Console.WriteLine("Please enter next digit of ISBN");
                ISBN[Count] = Convert.ToInt32(Console.ReadLine());
            }
            int CalculatedDigit = 0;
            int count = 1;
            while (count < 13)
            {
                CalculatedDigit = CalculatedDigit + ISBN[Count]; //This is where the error is being thrown.
                Count += 1;
                CalculatedDigit = CalculatedDigit + ISBN[Count] * 3;
                Count += 1;
            }
            while (CalculatedDigit >= 10)
            {
                CalculatedDigit -= 10;
            }
            CalculatedDigit = 10 - CalculatedDigit;
            if (CalculatedDigit == 10)
            {
                CalculatedDigit = 0;
            }
            if (CalculatedDigit == ISBN[13])
            {
                Console.WriteLine("Valid ISBN");
            }
            else
            {
                Console.WriteLine("Invalid ISBN");
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

问题是您使用的是Count,而不是发生错误的count

我建议以不同的方式命名变量,并坚持使用变量的所有较低驼峰案例名称的C#约定。这会导致编译器错误,这会立即影响您的问题,因为您将尝试重新定义上面已经定义的count

答案 1 :(得分:1)

您的问题就在这一行

if (CalculatedDigit == ISBN[13])

您定义ISBN长度为13,这意味着最高索引为12,因为索引基于零。

但即使在此之前,您的while循环正在检查count,但您在循环中使用Count,此时此值已经为13。

最后一点,while循环将第2到第13个字符(索引1到12)相加,并将校验位与最后一位数字进行比较。我猜你实际上想要将前12位数相加,所以你需要设置count = 0并检查count < 12

int CalculatedDigit = 0;
int count = 0;
while (count < 12)
{
    CalculatedDigit = CalculatedDigit + ISBN[count]; //This is where the error is being thrown.
    count += 1;
    CalculatedDigit = CalculatedDigit + ISBN[count] * 3;
    count += 1;
}

或者您可以执行以下操作

int CalculatedDigit = ISBN.Take(12)
                          .Select((v,i) => i%2 == 0 ? v : v*3)
                          .Sum();           
CalculatedDigit = 10 - (CalculatedDigit % 10);
CalculatedDigit = CalculatedDigit == 10 ? 0 : CalculatedDigit;

你不断减去10的循环实际上只是一个模数(%)。