事情是这样的,作为一个刚毕业就运气好的找到了工作的小社畜,本来开开心心的摸鱼学东西,直到上午,有一个小的功能需求,我大致描述一下这个先人遗留的一个程序,经典的中控。
整体的逻辑就是利用一份本地json文件作为主要配置文件对程序进行初始化,然后这份json中有一些数据结构没有用到(这是伏笔,待会用到),但是存在,本着有都有了,给它功能点加上吧的原则,我拿到了新的需求,需要用tcp来从客户端拿到视频并保存使用,这就是大致的背景介绍。
然后,我一顿操作之后,成功完成了,客户端通信,处理信息并写入,就差保存了,然后写入操作部分报错了,经典空报错,那么关于空报错,有如下几个可能的情况:
值类型的数据没有初始化。
虽然unity中int,string,list<T>之类的是可以在类中可以直接声明出来不进行赋值,但是这并不意味着你可以不进行后续的赋值操作呀,所以,一定要检查在使用前是否进行了赋值,不过这种还是比较常见的,一般都会直接在代码书写时就提示你了。
下标越界
这是循环有关的,这部分的原理就是for循环在c#中的运行机制是数据容器的类实现了迭代器中包含的三个方法导致的,分别是一个当前的object,一个movenext方法用来移动当前的object,一个reset的方法用于充值下标回到第一个值。所以很显而易见,下标越界的本质还是移动方法返回的object为空
多线程导致的问题
这种一般都是修改导致的空问题,还有一些就是同时访问导致的访问异常,无法获取导致报空。
空引用
经典核心错误,原因就是值类型在c#中是不允许为null的,但是unity用了什么方法允许它可以为null。
所以我的代码到底是哪一部分报错了呢?
经过我半个下午的寻找,终于,不是我的代码问题,是程序设计问题。
因为程序本身会在进入前通过http访问云端获取数据,然后再对数据进行初始化,于是,云端返回的数据中那些没用到的数据结构根本就不存在(因为它根本没用到所以就根本没有这部分数据,之前为什么用着没事的,因为虽然没有,但是程序上还是给它进行赋值了,但是没东西啊,所以程序给了个null,不得不说,可空还真是有点可怕的)。
所以不要全盘相信前辈的代码和注释,以及空引用检查一遍初始化之后顺便查查赋值带来的空引用问题!