【问题标题】:C# 'Index was outside the bounds of the array.' for one array but not anotherC# '索引超出了数组的范围。'对于一个阵列,但不是另一个
【发布时间】:2020-02-28 18:21:18
【问题描述】:

我有 2 个数组用于存储来自用户的 2 个系列的输入。我将两个数组的边界设置为等于同一个变量,但是在输入信息时,在第一个数组的最终输入之后,我得到一个异常“索引超出了数组的边界。”。

当我尝试将数组的边界更改为常数时,它们的行为正常。

            string[] names = new string[movies-1];
            double[] ratings = new double[movies-1];
            for(int i = 0; i < movies; i++)
            {
                names[i] = Console.ReadLine();
                ratings[i] = Convert.ToDouble(Console.ReadLine());
            }

System.IndexOutOfRangeException: '索引超出了数组的范围。'

【问题讨论】:

  • 你没有得到另一个异常的唯一原因是程序在第一个异常之后停止。如果你注释掉第一行,你会看到第二行抛出了同样的异常。
  • 除了完全有效的答案之外,您还可以做一些事情来帮助自己。鉴于您的数据类型,您可以使用 List,并且使用它不会产生负面影响,即使在性能方面它实际上可能更快。至于查找和处理异常,正确调试可能是未来需要考虑的事情。
  • 您应该考虑将相关数据保存在自定义类或元组中,这样您就可以只拥有一个值数组。

标签: c# indexing bounds


【解决方案1】:

你只差一(两次)-

  1. 数组的长度应为movies,而不是movies-1

  2. 迭代时,您希望i 最多等于movies-1,因为数组分配从0 开始。

考虑一下 - 如果 movies 等于 1(一部电影),那么您当前正在实例化一个具有 0 个插槽的数组 - 您尝试访问的任何索引都将超出范围。

【讨论】:

    【解决方案2】:

    C# 展示了基于零的索引。也就是说,大小为s 的数组的元素索引从0s - 1

    由于您声明数组names 的大小为movies - 1,其元素的索引从0movies - 2。因此,循环:

    for(int i = 0; i < movies; i++)
    {
        names[i] = Console.ReadLine();
        ratings[i] = ...
        ...
    

    i = movies - 1 时,将尝试访问数组namesratings 中的越界索引。

    你应该将你的数组声明为:

    string[] names = new string[movies];
    double[] ratings = new double[movies];
    

    以便它们与您的 for 循环定义一致。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多