最近碰到的一个问题:
AttributeError: ‘NoneType’ object has no attribute ‘landmark’
起因:
在做一个手指滑动(用摄像头识别,通过计算手指关键点的距离判定)控制Windows系统音量的程序(用Python写的)
分析:
先放上一段我出错的地方
从英文的字面意思来看,这里报错的类型属于引用错误,这个报错信息表示的是,NoneType这种类型的对象没有 landmark 这个属性
当时为什么出错?
看到59行这里,使用了一个 if ,最开始的程序时没有这个 if 的,这会导致一个什么问题呢?
在进行手指距离计算的时候,需要用到这个对象里面的数据,而这个对象是实时更新的,当摄像头没有捕捉到手时,这个对象里面就是None,所以就会报错,所以这会引发这种错误信息
怎么找出这个错误的?
用的是上图中第58行的那个输出语句,当时发现在未检测到手部时,屏幕上面会一直输出一个名为None的数值,而当我将手放置到摄像头前,检测出手的时候,就会出现一堆标记着 x y z 的数值,把手移开这些数值又会消失,所以瞬间就明白是为什么了
解决这个问题:
方法也很简单,就是像59行这样,在使用到这个对线之前使用 if 对其进行是否为空的判定,如果这个对象为空的话,这个 if 语句肯定也不会成立,自然不会去计算里面的数值
反思:
在使用到某个的对象的时候,应该先检查他是否为空,否则,将出现类似上述中的这个错误,现实中,出现空错误往往是致命的,就像在 C 语言中出现了空指针错误一样