变量previousValue返回NullReferenceException:对象未设置为object的实例

时间:2018-05-03 03:43:21

标签: c# android unity3d

此代码有错误

  

对象引用未设置为对象的实例

IEnumerator WinLog_big_road(){

string[] historyValue = new string[] { };

NetworkManager.Instance.WebSocketServer.OnCallBack_SC_WEBSOCKET_GametableHistory += CallBack_CS_WEBSOCKET_GametableHistory;

historyValue = PlayInfo.Instance.HistoryValue;

    foreach (var previousValue in historyValue)
    {
         if (previousValue.Contains(playerwinnopairboth))
         {
              o.GetComponent<UISprite>().spriteName = "layout_player_bigline-01";
              NGUITools.SetActive(o, true);
          }
    }
}

private void CallBack_CS_WEBSOCKET_GametableHistory(bool success, Int32 gametable_no, Int32 year, Int32 month, Int32 day, Int32 shoe_no, gametable_history_list list)
{
    string[] newString = new string[4];
    string[] newChars = new string[4];

    if (gametable_no == 1)
    {
        for (int i = 0; i < PlayInfo.Instance.gametable_history_list.Count; i++)
        {
            newString[0] += PlayInfo.Instance.gametable_history_list[i].r;
            newString[0] += ",";
        }
        newChars[0] = newString[0].Split(',').ToString();
    }
   //upto gametable 4
   PlayInfo.Instance.History = newChars;
}

在我的PlayInfo.Instance.History这里看起来像是什么

private string[] historyvalue;
public string[] HistoryValue
{
    get { return historyvalue; }
    set { historyvalue = value; }

}

我尝试使用我的扩展方法

检查我的数组是否为null
 public static bool IsNullOrEmpty(Array array)
{
    return (array == null || array.Length == 0);
}

所以我尝试了PlayInfo.Instance.History,如果它是null,但它不是空的。然后还尝试了我的historyValue,但它不是null

现在它指向我foreach(var previousValue in HistoryValue)我的previousValue为空。

我通过Debugging if(previousValue == null)证明了这一点,是的,它是一个null。

有人可以解释为什么它是空的。我没有得到PlayInfo.Instance.HistoryValue的值,然后将其传递给historyValue

2 个答案:

答案 0 :(得分:1)

我在您提供的代码中的任何位置都没有看到“tzPlayInfo”。但是,如果PlayInfo.Instance.History在设置historyValue之前有任何空值,则previousValue可能为null。从提供的代码我看不到PlayInfo.Instance.History将被填充的位置。

我想知道这条线的作用是否存在一些混淆。

NetworkManager.Instance.WebSocketServer.OnCallBack_SC_WEBSOCKET_GametableHistory += CallBack_CS_WEBSOCKET_GametableHistory;

这是将CallBack_CS_WEBSOCKET_GametableHistory添加为事件处理程序,但不调用该函数来执行。

答案 1 :(得分:1)

不是在IEnumerator函数上执行此操作,而是在CallBack_CS_WEBSOCKET_GametableHistory函数

上执行此操作
IEnumerator WinLog_big_road(){
NetworkManager.Instance.WebSocketServer.OnCallBack_SC_WEBSOCKET_GametableHistory += CallBack_CS_WEBSOCKET_GametableHistory;
}

然后在我的CallBack_CS_WEBSOCKET_GametableHistory函数

private void CallBack_CS_WEBSOCKET_GametableHistory(bool success, Int32 gametable_no, Int32 year, Int32 month, Int32 day, Int32 shoe_no, gametable_history_list list)
{
string[] newString = new string[4];

   if (gametable_no == 1)
   {
       for (int i = 0; i < PlayInfo.Instance.gametable_history_list.Count; i++)
       {
           newString[0] += PlayInfo.Instance.gametable_history_list[i].r;
           newString[0] += ",";
       }
       string[] newChars = newString[0].Split(',').ToString();
       DeleteChildrens(pos_big_road[0]);
       foreach (string previousValue in newChars)
       {
            GameObject o = Instantiate(prefab_big_road[0]) as GameObject;
            o.transform.SetParent(pos_big_road[0]);
            o.transform.localScale = Vector3.one;
            o.transform.localPosition = new Vector3(2.0f, -5.0f, 0f);
       }
    }
}

谢谢你们。