给产品经理讲技术
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

“空指针”是什么

“程序又崩溃(crash)了,这有个空指针!”想必产品经理经常听到程序员说这句话,他们对它可是又爱又恨。为什么这样说呢?

程序是运行在内存中的。内存就像一条规划得当、建筑整齐的街道,街道上每间房屋都有一个门牌号,为了方便管理,只允许一间房子住一个人。管理员为了能够准确地找到住户们,会分别设立箭头形的牌子指向各幢房屋,上面写上住户们的名字:“张三”“李四”……

管理员为什么不记门牌号?人类可不擅长记忆计算机世界的“门牌号”,它是形如0x3ac68b2f 的字符串。简单点说,指向房子的箭头牌子就相当于指针,而牌子上的词就相当于指针的名字,牌子指向的房子就相当于内存的地址,房子里的住户就相当于程序运算需要的数据。有了指针,程序员就能很容易地得到并操作内存中的数据了。

空指针,顾名思义,就是指向空的指针。但是“空”是一种极度抽象的概念,管理员立一块箭头牌子,总得把它指向某个具体的地址。既然没法指向真正的“空”,那就在内存中模拟出一个地址来代表“空”。具体指向没有明确的统一规定,不同的系统可以指向不同的地址,不过一般情况下,会指向0地址,访问它是非法的。

虽然空指针听起来好像很厉害,实际上写一个空指针的Bug只要两步:

第一步A=null。

第二步A doSomething。

怎么改呢?不负责任地讲,把第二步改成:

if(A !=null)

A doSomething;

这看起来是一个低级错误,但它毕竟是经过简化的,大部分空指针的 Bug 是隐藏在代码的茫茫大海中的。

不过,因为改起来很简单,程序员可喜欢改空指针的 Bug 了,可是简单修复了空指针后会引发哪些后续问题,很多程序员就不会去考虑了。