null(1.前奏)

作者:凝枫
链接:https://www.jianshu.com/p/da9c75b19fcd
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在软件发展的历程中,null就像一个幽灵,给人们带来了无数的问题。如今,null几乎就等同于“巨大财产损失的BUG”。所以就有很多开发人员想尽一切办法避免null的出现,比如有人就采用“返回0,而不返回NULL”来处理,也有人采用空对象模式(NullObject Pattern),还有人采用Optional/Maybe 模式。

你觉得在开发中该用这些方法?它们真保证达到一个预期可用性的软件吗?抑或还有别的更好的解决方案?这就是这篇文章想要回答的问题。

太多开发人员讨厌null,甚至是恨。

null正是臭名昭著的空指针错误(即JAVA中空指针异常)的罪魁祸首。

Manchester 学校的计算机系教授 John Sargeant 这么谈到:

在JAVA程序运行时,空指针异常无疑是目前最常见的错误了。

带有一点讽刺意味的来说,在JAVA中,空指针异常是唯一一个被人们授予了缩写名的异常:NPE。所以如果你和一个JAVA的开发人员说“这段代码里到处都有NPE”,他/她一定能明白你的意思。

(译者注:中间这里作者有一段比较重复的话..我这里略掉,直入正题!)

好了,有人要问了:“null如此可恨,为何这篇文章还要我们去爱TA”?

别着急,且听我一一道来。

在现实生活中,对于“无”的概念,我们有千千万万中表示方法。我可以举几个最简单的列子,哪怕是小孩子也能看懂:

· 冰箱里没有巧克力了(There is no chocolate in the fridge. )
· Fred并没有一辆自行车(Fred doesn't have a bicycle.)
· 教室里空空如也(The class room is empty.)

所以我们可以清晰的认识到:任何程序语言(甚至可以扩展到任何需要展示信息的技术)都必须有一种方式来表达“无”(Nothing)。

在1965年的时候,Tony Hoare想到了一种简单而聪明的办法来在计算机领域表示Nothing——你一定猜到了,那就是“null”;

其他语言也有用到一些其他关键词来表示同样的意思,比如nil,void,none 或者nothing。

请不要忽视null的地位——它真的是一个极其重要甚至奇特的概念。

自从有了null,我们就可以这样来描述事物了:

· Alice的生日还没有存到数据库里 (alice.birth_date = null)

· 这个顾客还没有下单(customer.order_list = null)

· 这个操作顺利完成,没有出现任何错误。(error = null)

· 我们不知道冰箱里有没有啤酒(fridge.beer = null)

我们先来看看null的一个简单的例子:

如果Alice有一个Email,那么代码大概是这样:

String email = "alice@company.com";

而如果她没有Email(或者地址不知道),那代码就成了这样:

String email = null;

然后我们检查她的Email地址是否真的存在,同时进行一点对应的处理:

if ( email != null ) {
   System.out.println ( "Alice's email address is " + email );
} else {
   System.out.println ( "Alice doesn't have an email address." );
}

怎么样,是不是简单,实际,上档次!(译者:很遗憾不是高大上= = )

既然挺好的,那..问题在哪呢?为什么null会导致这么多问题?

其实有一个非常简单而又独一无二的答案:

有时候,我们(开发人员)就是单纯忘记考虑某个值为null的情况了

对吧,多么简单而充分的理由,而且往往就像这样:

if ( you_never_forget_to_check_for_null ) {
   System.out.println ( "Bravo!!!" );
   System.out.println ( "Enjoy and be proud of an application free of null pointer errors." );
}

而且更加不幸的是,这种“健忘”在实际开发中比比皆是。这样对于层出不穷的空指针错误,咱们也就怪不怪了吧?相比小问题,有些BUG甚至直接导致灾难性的后果。

假设就继续以上述代码为例,我们忘记检查Alice的邮件地址是否存在了,直接无视了if判断然后直接写:

System.out.println ( "Alice's email address is " + email );

这时候就有两个非常重要的问题:

如果email变量为null,本应该出现什么状况?实际又出现了什么状况?

至少有3种情况有可能发生:

程序无视了null然后这样打印:

Alice's email address is 

程序直接以“null”打印:

Alice's email address is null

程序直接抛出一个空指针异常(NullPointerException)

这是一个非常小的null场景。尽管如此,但要搞清楚它到底会出现什么情况,还是要通过这些小测试来尝试,因为它往往都依赖于我们所采用的开发语言以及编译器。很多经验丰富的程序猿(包括我)在遇到这种情况的时候都会绞尽脑汁地去预测它可能出现的情况,而且毫不犹豫。这里我用了JAVA 8 ,然后非常迫切的等待这个结果。结果就是这样:

Alice's email address is null

有人肯定会觉得:“这挺好的啊,系统告知我们这个email是未知的了,而且更重要的是没有空指针异常出现。”


好了,我们刚刚上面使用了一个例子,而且我们想尽量的避免,或者压制住空指针错误的产生。

不过有一个疑问:这样做好吗?去想办法躲避空指针,这种做法真能提高代码的质量和软件的可用性吗?我们的开发中确实很需要这种技术吗?

在回答这个问题之前:我们先来看看目前比较流行的“防null大法”

1. 采用0来代替null
2. 使用空对象模式
3. 使用Optional/Maybe模式




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值