【问题标题】:C# ArgumentOutOfRange Exception, can not figure it outC# ArgumentOutOfRange 异常,想不通
【发布时间】:2015-03-26 09:39:33
【问题描述】:

我在处理图形的应用程序中遇到 ArgumentOutOfRange 异常(索引超出范围。必须为非负数且小于集合的大小。)(但我想弄清楚这并不重要错误在哪里)。

这是我的方法:

  public void InverznaFunkcia2(double a, double b, int n, List<Point> F, int m)
    {
        int i = 0;
        double yj = F[0].Y;
        double KrokX = (b - a) / n;
        double KrokY = (F[0].Y - F[n].Y) / m;


        for (int j = 0; j < m - 1; j++)
        {
            while (yj > F[i + 1].Y)
            {
                i = i + 1;
                if (F[i].Y > 200)
                {
                    break;
                }

            }
            invF.Add(j);

            //EXCEPTION THROWN ON THE FOLLOWING LINE:
            invF[j] =( a + (j + ((yj - F[i].Y) / (F[i + 1].Y - F[i].Y)) * KrokX));
           // invF[j].X = a + (j + ((yj - F[i].Y) / (F[i + 1].Y - F[i].Y)) * KrokX);
            yj = yj + KrokY;
            pomocneX.Add(j);
            double ux =  F[i].X -F[i+1].X;
            double uy =  F[i].Y - F[i+1].Y;
            double t = (invF[j] - F[i].Y) / uy;
            pomocneX[j] = F[i].X + (t * ux);



            //pomocneX[j] = ( a +  (j + ((yj - F[i].X) / (F[i + 1].X - F[i].X)) * KrokX));
            textBox3.Text += "invF" + j + "\t" + (invF[j] + "\r\n");
            textBox4.Text += "X" + j + "\t" + (pomocneX[j] + "\r\n"); 
        }
        //invF.Add(m);
       // invF[m] = (double)b;

    }

我知道这里已经讨论过这种类型的异常,但我不知道如何解决这个问题。谢谢你。

【问题讨论】:

  • 你为什么不简单地添加一个断点并与 i 和 j 比较验证 invF 和 F 的大小!
  • IDE 并不总是正确,但您也可以尝试点击开始 ([F5]),然后查看IDE 在正确的时间用当前值炸毁并捕获异常...
  • 在你的第一个while循环中你增加i并检查F[i]是否存在,但在你的错误行中你检查F[i+1]。所以当我恰好是 F 的最后一个元素时,你的代码错误

标签: c# arrays indexoutofboundsexception outofrangeexception


【解决方案1】:

k;让我们来剖析一下:

//EXCEPTION THROWN ON THE FOLLOWING LINE:
invF[j] =( a + (j + ((yj - F[i].Y) / (F[i + 1].Y - F[i].Y)) * KrokX));

现在;我可以开始询问诸如“jm 为界;我们如何知道invF[j] 是否有意义?”之类的问题;但是,添加一些调试代码会更容易:

try {
    invF[j] =( a + (j + ((yj - F[i].Y) / (F[i + 1].Y - F[i].Y)) * KrokX));
} catch(ArgumentOutOfRangeException) {
    Console.WriteLine("i={0},j={1},|invF|={2},|F|={3}",
        i, j, invF.Length, F.Length);
    throw;
}

这应该会告诉你问题出在哪里。

【讨论】:

  • 当然,一个或 2 个断点会让操作更容易:)
  • @Sayse 好吧,如果在第 4231 次迭代中失败,original 行上的断点可能无济于事 - 但Console.WriteLine 上的断点:当然
  • 当然,但是有条件或when an exception is thrown。 (注意:这更多是给 OP 的注释)
  • @MarcGravell System.Collection.Generic.List 不包含“长度”的定义......我该如何解决这个问题?
  • @user2179427 改用.Count
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多