我们在程序中经常在代码中会使用!=null,为了避免程序返回空指针异常,但是这样的代码会显得丑陋繁冗!

1.使用null的意义:

往往我们判断某个返回是不是为空的时候,应该思考两种情况:

(1):第一种

null是一个有效有意义的返回值

(2):第二种

null是无效有误的,毫无意义的。

2.第二种情况:

null就是一个不合理的参数,就应该明确地中断程序,往外抛错误。这种情况常见于api方法。例如你开发了一个接口,id是一个必选的参数,如果调用方没传这个参数给你,当然不行。你要感知到这个情况,告诉调用方“嘿,哥们,你传个null给我做甚"。

相对于判空语句,更好的检查方式有两个

(1)assert语句,你可以把错误原因放到assert的参数中,这样不仅能保护你的程序不往下走,而且还能把错误原因返回给调用方,岂不是一举两得。(原文介绍了assert的使用,这里省略)

(2)也可以直接抛出空指针异常。上面说了,此时null是个不合理的参数,有问题就是有问题,就应该大大方方往外抛。

3.第一种情况:

这种情况下,null是个”看上去“合理的值,例如,我查询数据库,某个查询条件下,就是没有对应值,此时null算是表达了“空”的概念。

1、假如方法的返回类型是collections,当返回结果是空时,你可以返回一个空的collections。

有些人看到这不是很理解,怎么给你说吧 :如果你需要给前端返回一个数组,但是你从数据库查询没得数据返回空,此时就不能直接返回null,而是返回一个空的list ,例如:

List<xxxVo> resultVo=new ArrayList<>();
 List<AiOrganizationClueRelationVo> list = aiOrganizationClueRelationAnalysisMapper.selectAiOrganizationClueRelation(organizationId);
if(CollUtil.isEmpty){
	return resultVo;
}

这样调用侧就能大胆地处理这个返回,例如调用侧拿到返回后,可以直接print list.size(),又无需担心空指针问题。(什么?想调用这个方法时,不记得之前实现该方法有没按照这个原则?所以说,代码习惯很重要!如果你养成习惯,都是这样写代码(返回空collections而不返回null),你调用自己写的方法时,就能大胆地忽略判空)

2、返回类型不是collections,又怎么办呢?

那就返回一个空对象(而非null对象),比如要返回给前端一个bean对象,此时不能直接返回null,而是需要new一个对象进行返回给前端,这样前端能拿到值虽然是null,但是至少不会报500。

4. 使用equals比较注意的地方:

如果要用equal方法,请用object<不可能为空>.equal(object<可能为空>))

例如:

"bar".equals(foo)

而不是

foo.equals("bar")

5.总结:

在程序中应该思考某个参数或者返回参数时候有意义,考虑是否为空的必要。如果对于某些地方返回了null。此时这个地方是否有必要抛一个异常呢!