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
相关产品推荐
相关产品推荐

