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

Unity开发中自定义类List<>返回null问题求助

问题解决:List始终为null的原因及修复

核心问题

你声明了private List<Words> _wordsList;但从未实例化这个集合,所以它始终是null——调用_wordsList.Add()实际上会触发空引用异常,只是被try/catch捕获后你没看到具体错误。

修复步骤

1. 初始化List

有两种可靠的初始化方式:

  • 直接在声明时初始化:
private List<Words> _wordsList = new List<Words>();
  • 或者在Start()方法开头初始化:
private void Start()
{
    try
    { 
        _wordsList = new List<Words>(); // 先实例化List,再执行后续操作
        // ... 其他代码
    }
    // ...
}

2. 优化脆弱的字符串处理逻辑

你当前用硬编码长度(比如textFromFile.Remove(0,3))截取字符串的方式容错性极差,一旦文件第一行数字位数变化就会出错,而且代码只处理了一行数据,没有循环读取所有条目。以下是更健壮的实现:

private void Start()
{
    try
    { 
        _wordsList = new List<Words>();
        var textFromFile = myFile.ToString();
        // 按行分割,兼容不同换行符格式
        var lines = textFromFile.Split(new[] { _seperatorEndOfLine, "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
        
        // 读取第一行的条目数量,用TryParse避免格式错误崩溃
        if (!int.TryParse(lines[0], out var numberOfWords))
        {
            Debug.LogError("文件第一行不是有效的数字");
            return;
        }

        // 从第二行开始遍历所有条目,最多读取numberOfWords条
        for (int i = 1; i < lines.Length && i <= numberOfWords; i++)
        {
            var parts = lines[i].Split(new[] { _seperatorParts }, StringSplitOptions.RemoveEmptyEntries);
            if (parts.Length != 2)
            {
                Debug.LogWarning($"第{i+1}行格式错误:{lines[i]}");
                continue;
            }

            if (int.TryParse(parts[1], out var damage))
            {
                _wordsList.Add(new Words(parts[0].Trim(), damage));
            }
            else
            {
                Debug.LogWarning($"第{i+1}行的伤害值无效:{parts[1]}");
            }
        }

        // 正确打印List内容
        Debug.Log($"共加载{_wordsList.Count}个单词条目:");
        foreach (var word in _wordsList)
        {
            Debug.Log(word.ToString());
        }
        // 也可以用string.Join一次性输出
        // Debug.Log(string.Join("", _wordsList));
    }
    catch (Exception e)
    {
       Debug.LogError($"加载数据出错:{e.Message}");
    }
}

3. 关于Debug.Log的说明

直接调用_wordsList.ToString()只会输出集合的类型名(比如System.Collections.Generic.List1[Words]),而不是内部元素。你需要遍历List打印每个元素,或者用string.Join把所有元素的ToString()`结果拼接起来。

额外建议

给Words类添加公共只读属性,方便后续灵活访问内部数据(现在只能通过ToString()获取,局限性很大):

public class Words
{
    public string MyWord { get; }
    public int Damage { get; }

    public Words()
    {
        MyWord = "";
        Damage = 0;
    }

    public Words(string word, int damage)
    {
        MyWord = word;
        Damage = damage;
    }

    public override string ToString()
    {
        return $"{MyWord}:{Damage}\n";
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 14:47:32