【问题标题】:C# Unity/Mono DLL - Variable suddenly null when passed into functionC# Unity/Mono DLL - 传递给函数时变量突然为空
【发布时间】:2016-10-26 20:48:28
【问题描述】:

遇到了一个非常奇怪的问题,没有多大意义。

我们有一个使用 Unity 3.5 编译的 C# dll,由于 Android 上的一个变量为空,我们得到一个空引用异常。

我们将一个类传递给一个函数,然后在函数中对该类做一些工作。在将对象传递给函数之前,这是正常的。一旦进入函数,它就是空的......

只有在非开发模式下构建我们的 Unity 项目时才会出现此错误。

有时我们在函数中添加的空值检查实际上会产生空引用异常。这绝对是奇怪的。如果有错误,空检查只会打印到输出日志。如果我们把这个空检查放在一个 try catch 块中,那么就不会产生异常并且它按预期工作。所以它可以通过在顶部添加一些调试代码来打印,如果它在 try catch 块中为空。

任何帮助将不胜感激。我不知道代码中有多少其他地方会发生这样的事情。我必须让它工作的“修复”真的不是修复,似乎还有其他一些潜在的问题。

(我们传递的类没有任何特殊的重载运算符等会导致对其进行空检查而导致异常或类似情况)

伪代码示例:

    void FunctionOne(InputClass myVar)
{

    while (memberStack.Empty() == false)
    {
        var stackPop = memberStack.pop();

        if (myVar == null)
        {
            //At this point the myVar will always be non-null
        }

        FunctionTwo(stackPop, myVar);

    }

}

void FunctionTwo(StackVar stckvar, InputClass myVar)
{

    if (myVar == null)
    {
        //Sometimes though at this point, the myVar will suddenly be null
        //myVar IS NULL
    }

    //DO OTHER WORK

}

InputClass的类定义:

    protected class InputClass
    {
        public bool backup;
        public Stack<STRUCT1> plan;
        public Stack<int> locked;
        public int length;
        public Terminate terminate; //ENUM TYPE
        public HashSet<int> unlocked;
        public List<OBJTYPE1> unassigned;
        public List<OBJTYPE1> damaged;
        public List<OBJTYPE1> replacedObjs;

        public bool IsLocked(OBJTYPE1 subOBJ)
        {
            int compressed = subOBJ.compressed;
            return !unlocked.Contains(compressed) || depLocked.Contains(compressed);
        }
    }

【问题讨论】:

  • 您是否尝试过使用 ref 修饰符将其作为参考传递?像“FuntionTwo(stackpop, ref myVar);” ?
  • 是的,已经尝试过了。不过没有任何区别。
  • @Comeradealexi - 你有没有解决这个问题?还有其他人经历过类似的事情吗? (在 Unix 系统上使用 Mono 运行我的 C# 应用程序时,我遇到不应该为空的对象导致空引用异常)
  • @giladrv 我认为我们最终保留了“修复”并升级到较新版本的 Unity。看看您是否可以重新调整代码以使其神奇地工作是我所能建议的!

标签: c# unity3d dll mono nullreferenceexception


【解决方案1】:

假设你将 someClassInstance 传递给 anotherClass.SomeMethod 请试试这个

var localReference = someClassInstance;
if (localReference == null){
  // log it is null before the call
}
anotherClass.SomeMethod(localReference);

如果您碰巧记录了空引用,那么您之前可能确实忘记为实例设置一些闭包。然后您需要跟踪该调用。

【讨论】:

  • 我的两分钱你添加的代码..我猜如果 void FunctionOne(InputClass myVar) 总是得到一个非空对象,而在 FunctionTwo 中它有时是..你能在功能一?你知道更多关于 InputClass 的类定义吗?是不是例如IDisposable,您是否在 using{} 上下文中调用方法一?
  • 已添加类定义示例。没有完全按原样发布它,因为我认为我们不允许这样做,但要知道它包含什么。它基本上是大量的列表。我可以尝试制作一个副本,看看是否有任何作用。
猜你喜欢
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多