数组中的ArgumentOutOfRange异常

时间:2017-04-18 19:19:57

标签: c# arrays exception

我正在创建一个方法,找出下一个和前一个元素值之间的最小绝对差异。

在方法中出现ArgumentOutofRange异常。但是当我添加try时,捕获异常就可以了。我的代码中出现了什么问题?然而我创造了适当的条件,如“如果我等于0”当然它找不到[i-1],那么它将是下一个值[1]和[0]之间的差异。如果它成为最后一个元素,则其值(最后[i-1])和之前([i-2])

之间的差值
namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Cla> Clalist = new List<Cla>();
            Clalist.Add(new Cla(0));
            Clalist.Add(new Cla(2));
            Clalist.Add(new Cla(3));
            Clalist.Add(new Cla(10));
            Clalist.Add(new Cla(100));
            Clalist.Add(new Cla(65));

            Program nn = new Program();
            nn.GetAbs(Clalist);

            Console.WriteLine(Clalist[0].AbsValue);
            Console.WriteLine(Clalist[1].AbsValue);
            Console.WriteLine(Clalist[2].AbsValue);
            Console.WriteLine(Clalist[3].AbsValue);
            Console.WriteLine(Clalist[4].AbsValue);
            Console.WriteLine(Clalist[5].AbsValue);

            Console.ReadLine();
        }
        public void GetAbs(List<Cla> n)
        {
            int z = n.Count;
            for (int i = 0; i < z; i++)
            {
                if(i == 0)
                {
                    n[0].AbsValue = Math.Abs(n[1].Value - n[0].Value);
                }
                if(i == (z-1))
                {
                    n[z-1].AbsValue = Math.Abs(n[z-1].Value - n[z -2].Value);
                }
                else
                {
                    try
                    {
                        var AbsV = Math.Abs(n[i + 1].Value - n[i].Value);
                        var AbsV2 = Math.Abs(n[i - 1].Value - n[i].Value); //exception occurs here
                        if (AbsV < AbsV2)
                            n[i].AbsValue = AbsV;
                        else
                            n[i].AbsValue = AbsV2;
                    }
                 /*   catch (ArgumentOutOfRangeException)
                    {
                        n[0].AbsValue = n[1].Value - n[0].Value; */ When i add this it works
                    }
                    }
                }
            }
        }
    }

    class Cla
    {
        public int Value;
        public int AbsValue;
        public Cla(int v)
        {
            Value = v;
        }
    }

2 个答案:

答案 0 :(得分:4)

您应该有三个互斥的案例:

  1. i == 0(左边框)
  2. i == z - 1(右边框)
  3. i == 1..z-2(内在值)
  4. 像这样:

    for (int i = 0; i < z; i++)
    {
        if (i == 0)           // 1st case (left border)
        {
            n[0].AbsValue = Math.Abs(n[1].Value - n[0].Value);
        }
        else if(i == (z-1))  // 2nd (please, notice "else if") (right border)
        {
           n[z-1].AbsValue = Math.Abs(n[z-1].Value - n[z -2].Value);
        }
        else // 3d (inner values)
        {
        ....
        }
    

答案 1 :(得分:1)

i == 0时发生抛出异常的行。第二个if语句需要成为else if,或else需要成为else if(i > 0)