前言
一般来说,新手遇到bug会很苦恼,而且打击自己的学习积极性。我在看完一套学习视频后,自己关掉,然后看自己能不能完完全全的再写出来,并且尽力让他趋于完美。其实这样的话,我相当于把代码写了两遍,看视频的时候跟着敲了一遍,自己又写了一遍。虽然苦,但是乐在其中
异常分类
- 我将异常分为四种
- 在控制台上双击可以定位的异常
- 这种异常也许是由于上下文引起的
- 也有可能属于蝴蝶效应,间接引发的
- 无法定位的异常
- 用二分法进行注释,然后排查是哪句话出现的错误,结合错误类型进行定位
- 没有任何报错,但就是实现不了想要的功能
- 首先将功能所涉及的函数全部Log,查看是否全部执行
- 将函数中所涉及的关键变量Log出来,查看其变化
- 根据变量所显现出来的问题,进一步锁定出现问题的代码
- 然后将代码打上断点,运行此处,查看变量的情况。做到这一步基本就可以解决问题了
- 逻辑错误
- 这种错误最低级也最致命,没有解决办法,只能多思考
下面的异常我将按照不同种类给予不同的标志数字
1-空引用异常
- 当时我对代码进行了重构,该删的删,该加的加,该移的移动
- 当我运行的时候 ,果然出现了很多bug
- 最常出现的是空引用异常
- 双击定位到代码位置,打上断点,开始调试,然后查看这个语句的所有变量值,看哪个为null
- 或者在语句的上面Log输出每一个变量值,查看哪一个为空
- 结果是我定义了一个集合,错误的把初始化语句给删除了,所以为空
1-2 物品显示与隐藏异常
- 这个出现的空引用异常是最匪夷所思的,但是明白原理之后发现情有可原
- unity 是无法搜索被隐藏的对象的
- 父对象由于切换功能的需要,在一开始实例化出来后就要全部禁用,这样的话它的子对象在查找自身或者子对象就会报错空引用
- 代码如下:
GameObject tempCenter = GameObject.Instantiate<GameObject>(myView.Center, myView.CenterParent);
CenterController tempS = tempCenter.GetComponent<CenterController>();
//进行数据传输
tempS.InitData(mapId, myView.CenterSlot, myModel.GetCenterItem(mapId), myModel.GetMapNum(mapId), myView.CenterItemDic);
//加入字典当中
centerDic.Add(mapId, tempS);
tempCenter.SetActive(false); //禁用语句
- 这个异常并没有很复杂,关键是要知道有这么一个bug,并且怎么解决
- 我在解决的时候,就在想要把
SetActive(false)
放在哪里- 我认为禁用语句属于自身控制语句,应该放置在它自己的脚本里,就放置在了Awake语句中,结果明显不行
- 我又想,干脆在子对象的初始化语句后面加上启用语句,结果还是不行
2- 1KeyNotFound 异常
- 这个异常几乎耗了我一个上午
- 依然是重构完的事情,这个异常双击之后无法定位。所以我就很烦恼,到底是哪里出了问题
- 在控制台下面,有关于这个语句的详细分析,是在哪个脚本里面
- 我将在start里面执行的函数一一注释,最后确定问题是在哪个函数里面
- 然后将函数里面的语句根据功能进行注释,然后运行,最后将问题锁定到其中一个语句上面
- 最后发现,我将Model层的字典直接以属性的形式返回出来,在获取value的时候,没有进行key检查
- 原因是,我以前一直将字典封装,根据key返回value,用tryGetValue方法,可以返回null,如果key不存在。所以没有在意这个问题
3 异常
- 实时物品检测功能
- 这个异常是我代码都全部写好了,控制台也没有报错,但没有实现我的功能。
- 这种异常是最棘手的。
函数之间的关系
- 函数之间有这么几种关系
- A调用B
- A调用上层B
- A调用下层B
- 单例模式之间的调用
注意事项
- 在脚本内写新的功能代码的时候,每写完一个函数,需要对自身的输出进行Debug测试,是否输出自己想要的数据
- 如果以上那几种函数调用关系,调用函数的签名确定以后,先在函数里面进行Debug,传递的参数是否正常,符合预期,函数是否运行到这里,
- 每写一句代码都要思考,如果不这样的话会怎么样?
- 例如SendMessaagesUp,我在子对象的方法构建完毕后,进行了测试,因为这时候父对象的方法还没有构思,因此里面的sendMessageUp没有测试,在后面的时候发现传递过去的参数不符合预期
感言
- 良好的代码书写习惯很重要,可以避免浪费很多时间
- 学习过程中需要适时的总结归纳
- 以前在学校上课,这个过程被老师替代了,自学的话就需要自己来做