【发布时间】: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