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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:34:53