我在以下代码的第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;
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;
}
}
由于 视图 为空而引发System.NullReferenceExeption ,但我无法弄清楚原因。除 视图 外,所有变量都具有正确的值。在这种情况下, 州 是 1 ,这意味着 if 中的代码已执行, 标记 3 ,表示行: 70 , 72 和 74 被执行没有问题。如果出于某种原因,新会在 70 行失败,则会在行 72 处抛出异常。我是对的吗?...但行 75 和 76 也没有问题。
我能找到这种行为的唯一合理解释是 view 被垃圾收集,但无法理解为什么......如果是这种情况,如何我可以阻止 查看 进行垃圾回收吗?
修改
程序中没有其他地方 州 设置为 1 ,也没有任何其他值。 view 永远不会在程序中的任何位置设置为 null 。你看到的是整个功能代码,我只删除了变量声明和初始化,其中没有一个涉及 state ,也没有 view < / strong>即可。 州 和 视图 均声明为私有。
此代码是我在 Unity 中执行的测试项目。
修改
这不是一个固定的问题,它只会偶尔发生一次,似乎涉及某种时间,因为直到现在我完全无法用调试器重复这个问题。
答案 0 :(得分:0)
从我所看到的,标记是计数多少数组插槽有值,而它们被分配的索引是I.所以,这是一种可能发生的情况:
null,null,null,1,null,0,2
其中mark为3,行为7.您的第二个用于标记,访问前三个null元素。
我知道您正在将数组中的每个条目设置为新的Log(),但这是一个非常有效的逻辑错误。也许,null的对象可能不是视图或视图[I],而是查看[I] .time?执行代码的逐行跟踪,我们肯定会知道。
答案 1 :(得分:0)
我仍然不知道为什么会出现这个问题,而且可能永远都不会。我修改了 OnGUI ,所以如果由 view == null 而不是 控制state == 0 ,这样一来,如果由于某些奇怪的原因 view 变为 null ,它就会被恢复。