Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 此异常是由于垃圾收集引起的吗?_C#_User Interface_Garbage Collection_Unity3d - Fatal编程技术网

C# 此异常是由于垃圾收集引起的吗?

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;

我在下面代码的第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;
    }
}
专用字节状态=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,因此ifview==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找出问题的根本原因。不理解自己的代码会导致灾难。