求助:Dictionary键不存在异常(KeyNotFoundException)排查
解决KeyNotFoundException:字典中不存在给定键的问题
看起来你在处理UpgradeManager的升级扫描逻辑时碰到了KeyNotFoundException,这是字典操作里很常见的问题,我来帮你梳理下排查和解决的思路:
核心问题定位
从调用栈能明确,错误出在Assets/Scripts/UpgradeManager.cs的第125行——你尝试用某个int键访问Dictionary<int, string>的Item属性时,这个键并没有被添加到字典中,这就是异常触发的直接原因。
具体排查与解决步骤
- 先锁定目标键:找到第125行的代码,明确你用的是哪个键去访问字典。不管这个键是来自配置ID、计算值还是其他来源,先把它的具体数值打日志输出,确认它的真实内容。
- 改用安全的字典访问方式:别直接用
dict[key]这种容易抛出异常的写法,换成更稳妥的方式:- 用
ContainsKey()做前置检查:int targetKey = // 你的目标键值 if (yourDictionary.ContainsKey(targetKey)) { string upgradeInfo = yourDictionary[targetKey]; // 后续升级扫描逻辑 } else { Debug.LogWarning($"警告:升级字典中找不到键 {targetKey},请检查数据初始化"); // 这里可以添加降级逻辑,比如用默认值或者跳过该升级项 } - 更推荐用
TryGetValue()(原子操作,多线程场景下更安全):if (yourDictionary.TryGetValue(targetKey, out string upgradeInfo)) { // 成功获取值,执行后续逻辑 } else { // 键不存在时的处理逻辑 }
- 用
- 检查字典的初始化逻辑:确认在调用
ScanForAvailableUpgrades()之前,字典已经被正确填充了所有需要的键值对。会不会是某些升级项的键漏加了?或者配置文件里的数据有缺失?可以在方法开头打印字典的所有键,验证目标键是否在其中:Debug.Log("当前升级字典包含的键:" + string.Join(", ", yourDictionary.Keys)); - 核对注释与实际逻辑:你提到相关逻辑已在注释中说明,但实际运行出错,可能注释描述的键范围和代码中实际使用的键不匹配。再仔细对比注释里的预期键值和代码中生成/使用的键是否一致。
内容的提问来源于stack exchange,提问作者ForgedInFlame
相关产品推荐
相关产品推荐

