You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node类Setter方法为何失效?触发IndexOutOfRangeException异常

问题分析与解决

IndexOutOfRangeException 异常原因

触发这个异常是因为索引越界:

  • Node类的datas数组长度为10,有效索引范围是0~9。
  • Add方法中,index是静态变量,每次调用Add就直接执行index++,完全没有检查是否已到达当前Node数组的上限(索引9)。当index增长到10时,执行last.datas[index] = data会访问datas[10],直接触发索引越界异常。

Ignite 属性Setter未生效的原因

你的预期是通过Ignite的Setter创建新Node,但当前代码从未触发过这个Setter:

  • Setter只有在执行Ignite = 某个值时才会被调用,而你仅在Node构造函数中写了datas[9] = Ignite;——这是读取Ignite的getter,不会触发setter逻辑。
  • Add方法中没有判断逻辑:当填充到当前Node数组的最后一个位置(index=9)时,去调用Ignite的赋值操作,自然不会创建新的Node。

静态变量的设计错误

index和last被定义为static,这意味着所有DynamicArray实例会共享同一个索引和最后节点,完全违背了动态数组的实例隔离要求,会导致多个实例的操作互相干扰。

修正后的代码示例

public class DynamicArray
{
    // 移除static修饰符,每个实例拥有独立的索引和最后节点
    private int _index = 0;
    public Node Head { get; private set; }
    private Node _last;
    
    public DynamicArray()
    {
        Head = new Node();
        _last = Head;
    }

    public class Node
    {
        public object[] Datas = new object[10];
        private object _ignite;
        public Node? Next { get; private set; }

        public object Ignite 
        {   
            get 
            { 
                return _ignite; 
            }
            set 
            {
                Next = new Node();
                _ignite = value;
            }
        }
    }

    public void Add(object data)
    {
        // 检查是否到达当前节点数组的容量上限
        if (_index >= _last.Datas.Length)
        {
            // 触发Ignite的Setter,创建新节点
            _last.Ignite = new object();
            // 切换到新节点并重置索引
            _last = _last.Next;
            _index = 0;
        }
        _last.Datas[_index] = data;
        _index++;
    }
}

内容的提问来源于stack exchange,提问作者Can

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 21:12:46