我们经常在进行查询或者传一个对象过来时都需要判断是否为空的情况. 最近做项目时想过, 为什么一定是用 == null 去判断呢, 能否用别的呢? 还有判断为空是null还是空值(""), 就像这样. 未做null判断是会抛出空指针异常的, 那么null到底是什么? 以及equals(), isEmpty(), == 这些判断到底是判断什么的
例如我定义一个变量为空时, 用isEmpty()判断时直接抛出空指针异常
我们通过去查看isEmpty()的源码可知, 这是判断字符串值的大小, 也就是判断字符串是否为空值的情况的, 是不能够用来作是否为null的判断的, 就如上述抛出空指针异常一样
所以, 当我尝试这样去定义一个空值时, isEmpty()判断值的大小为0 返回true
接下来就是我们经常用的equals()方法了, 这个方法比的是字符串的地址, 像这样很容易抛出异常, 同过看源码可以得知和object类型比, 那么为什么会报错呢? 原因就在于我们把a一个为null的变量去比了, 源码中是那this和object类型去比对, 那么也就是说比对的类型可以是任意, 但是this值指向的是一个地址, 如果a定义为null, 那么也就是说这个变量不存在, 也就没用地址这个说法, 比如我把a = "", 定义之后, 那么就会返回非空值这个结果. 也就是说equals可以判断值为空这个情况的.
接下来就是就是最常用 == 了, 这真的是一个很神奇的用法, 它可以对比数值大小, 是否为null情况, 甚至它能用null和null去对比
空值也可以和null去比对.
所以说, 对一个可能为null的变量, 或者是为null对象(在传递对象作为参数是一定会有null对象的, 必须进行判断为null情况从而抛出或者处理该异常). 最好最稳定的方法是用 == 去判断, 要分清楚到底是为空值或者为null, 我们一般很喜欢说判断为空的情况, 这个空的指向其实是不明确的, 空值不做处理会出现逻辑类的错误, 但是null情况不做处理一定会出现指针异常, 因为系统也不知道一个从一个为null的对象里面获取什么东西, 因为它为null 是未知的, 既然未知那么就不可能去调用未知对象里的方法, 比如向数据库查询一个用户, 这个用户不存在, 那么定义这个用户的对象便不存在, 返回的是一个null对象, 而不是空值, 不存在不等于大小为0