C# 此异常是由于垃圾收集引起的吗?
我在下面代码的第89行遇到了一个奇怪的异常:C# 此异常是由于垃圾收集引起的吗?,c#,user-interface,garbage-collection,unity3d,C#,User Interface,Garbage Collection,Unity3d,我在下面代码的第89行遇到了一个奇怪的异常: private byte state = 0; . . . void OnGUI(){ int i; GUI.skin = skin; GUI.skin.box.fontSize = 25; GUI.skin.label.fontSize = 18; if(state==0){ GUI.skin.font = system;
private byte state = 0;
.
.
.
void OnGUI(){
int i;
GUI.skin = skin;
GUI.skin.box.fontSize = 25;
GUI.skin.label.fontSize = 18;
if(state==0){
GUI.skin.font = system;
GUIContent tA = new GUIContent("A");
Vector2 tz = GUI.skin.label.CalcSize(tA);
GUI.skin.label.CalcHeight(tA,tz.x);
height = (byte) tz.y;
rows = (byte) (Screen.height/height);
mark = 0;
70 view = new Log[rows];
for(i=0;i<rows;i++){
72 view[i] = new Log();
if(vis.ValidRow()){
74 mark++;
75 view[i].time = vis.time;
76 view[i].descrip = vis.descrip;
vis.Next();
}
}
state = 1;
}
GUI.skin.font = chrome;
GUI.Box(new Rect(0,0,Screen.width,50),"Server");
GUI.color = Color.green;
GUI.skin.font = system;
short y = 50;
for(i=0;i<mark;i++){
89 GUI.Label(new Rect(10,y,200,height),String.Format("{0:yyyy/MM/dd HH:mm:ss}",view[i].time));
GUI.Label(new Rect(220,y,Screen.width-260,height),view[i].descrip);
y += height;
}
}
专用字节状态=0;
.
.
.
void OnGUI(){
int i;
GUI.skin=皮肤;
GUI.skin.box.fontSize=25;
GUI.skin.label.fontSize=18;
如果(状态==0){
GUI.skin.font=系统;
GUIContent tA=新的GUIContent(“A”);
vector2tz=GUI.skin.label.CalcSize(tA);
GUI.skin.label.CalcHeight(tA,tz.x);
高度=(字节)tz.y;
行=(字节)(屏幕高度/高度);
分数=0;
70视图=新日志[行];
对于(i=0;i,从我所看到的,mark正在计算有多少数组槽有值,而分配它们的索引是i。因此,这是一种可能发生的情况:
空,空,空,1,空,0,2
其中mark是3,rows是7。第二个是要标记的计数,访问前三个null元素
我知道您正在将数组中的每个条目都设置为new Log(),但这是一个非常有效的逻辑错误。此外,可能null的对象不是view或view[I],而是view[I].time?逐行跟踪代码,我们就可以确定了。我仍然不知道为什么会发生这个问题,而且可能永远不会。我修改了OnGUI,因此if由view==null而不是state==0控制,如果出于某种奇怪的原因view变为null它将被还原。状态
为1
不足以证明if块中的代码已运行。问题是其他地方正在设置状态
,或者其他一些代码正在将视图
设置为null。@lc其他地方?何处?胞质代码?变量除外声明,以及一些通过唤醒进行的初始化,这几乎就是整个程序,没有其他地方的状态变为1,也没有一个view=null,这就是为什么我首先发布这个问题。我99%确定这一切都与垃圾收集无关,但是你能发布标签的代码吗?@lc我不能发布这个code因为它是Unity的一部分,它是内部的,我没有访问它的权限。如果视图是在OnGUI
方法之外定义的,那么它就没有被垃圾收集。如果它是null
,那么它要么从未被设置,要么被其他东西设置为null
。我怀疑它是“胞质代码”您确定没有其他代码修改这些变量中的任何一个?如果没有,那么为什么在类范围内而不是在OnGUI
方法中声明它们?问题不是:view[i]==null
,问题是:视图==null
,就像第70行没有执行一样,但是如果第70行没有执行,那么如何解释标记0
和状态==1
??如果新建
失败,如何解释在第72行没有抛出异常???我能找到的唯一逻辑解释是垃圾处理收集问题。如果你仔细阅读,你会意识到这个问题,正如我所测试的那样,在有活动断点的情况下不会发生,所以直到今天我都无法跟踪程序,原因是我发布了这个问题。我有MonoDevelop设置来在异常时中断,我已经检查了异常发生时的所有变量CCUR和它们都有正确的值,除了view
是null
,也就是说:view==null
。我没有看到你的代码在任何地方检查state==1。至于mark,我不知道。你能在这里发布整个代码吗?你的这个异常让我非常好奇!我建议你继续调试到fi找出问题的根本原因。不理解自己的代码会导致灾难。