Variable返回NullReferenceException及代码空引用异常问题求助
排查并解决你的空引用异常问题
咱们一步步拆解代码里可能触发NullReferenceException的关键点,逐个解决:
1. previousValue引发的空引用问题
你提到的这个异常,大概率是两个原因导致的:
PlayInfo.Instance.HistoryValue本身为null:你直接把historyValue赋值给这个属性,如果PlayInfo的单例还没初始化(Instance是null),或者HistoryValue属性没被正确赋值过,那historyValue就是null,foreach遍历的时候直接就会报错。HistoryValue数组里存在null元素:就算数组本身不是null,但如果数组里有某个元素是null,那foreach拿到的previousValue就是null,调用Contains()方法自然会触发空引用。
对应解决办法:
先加一层判断,确保数组和元素都不为null再执行逻辑:
// 先检查PlayInfo单例和HistoryValue是否有效 if (PlayInfo.Instance != null && PlayInfo.Instance.HistoryValue != null) { historyValue = PlayInfo.Instance.HistoryValue; // 遍历的时候过滤掉数组里的null元素 foreach (var previousValue in historyValue.Where(v => v != null)) { if (previousValue.Contains(playerwinnopairboth)) { // 后续逻辑 } } }
2. 代码里其他潜在的空引用雷区
除了previousValue,你的代码还有几个容易踩坑的地方:
NetworkManager.Instance可能未初始化:如果NetworkManager的单例还没创建,直接访问Instance会触发空引用,更别说绑定回调事件了。o对象可能为null:o.GetComponent<UISprite>()这里,如果o是未赋值的变量,或者找不到对应的游戏对象,GetComponent会返回null,后续设置spriteName就会报错。playerwinnopairboth可能为null:如果这个变量没赋值,previousValue.Contains()也会抛出参数null的异常,也得排查。
对应解决办法:
给这些关键点都加上前置检查,避免空引用:
IEnumerator WinLog_big_road() { string[] historyValue = new string[] { }; // 先检查NetworkManager单例是否存在 if (NetworkManager.Instance != null) { NetworkManager.Instance.WebSocketServer.OnCallBack_SC_WEBSOCKET_GametableHistory += CallBack_CS_WEBSOCKET_GametableHistory; } // 检查PlayInfo单例和HistoryValue有效性 if (PlayInfo.Instance != null && PlayInfo.Instance.HistoryValue != null) { historyValue = PlayInfo.Instance.HistoryValue; foreach (var previousValue in historyValue.Where(v => v != null)) { // 同时检查playerwinnopairboth不为null或空字符串 if (!string.IsNullOrEmpty(playerwinnopairboth) && previousValue.Contains(playerwinnopairboth)) { // 先检查o对象和UISprite组件是否存在 if (o != null) { var uiSprite = o.GetComponent<UISprite>(); if (uiSprite != null) { uiSprite.spriteName = "layout_player_bigline-01"; } } // NGUITools相关逻辑也记得加必要的null检查 } } } yield return null; // 协程里别忘了加yield返回,你的代码里好像漏了 }
额外排查小技巧
- 用Unity的Debug工具定位:在可能为空的地方加
Debug.Log(),比如Debug.Log(PlayInfo.Instance)、Debug.Log(PlayInfo.Instance.HistoryValue),看看哪个是null。 - 检查单例初始化时机:确保
NetworkManager和PlayInfo的单例在调用这个协程之前,已经在Awake()里完成了初始化。 - 确认数组赋值逻辑:看看
HistoryValue是在哪里被赋值的,如果是异步加载数据(比如从服务器拉取),要等数据回调完成后再执行遍历逻辑,不然数组还没内容就会出问题。
内容的提问来源于stack exchange,提问作者Ginxxx
相关产品推荐
相关产品推荐

