0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

介绍assert的使用方法

Linux爱好者 来源:stackoverflow 作者:stackoverflow 2022-03-17 14:06 次阅读

为了避免空指针调用,我们经常会看到这样的语句

...if (someobject != null) {
    someobject.doCalc();}...

最终,项目中会存在大量判空代码,丑陋繁杂。。。如何避免这种情况?是否滥用了判空?

很多业务场景需要我们某一特定的时刻去做某件任务,定时任务解决的就是这种业务场景。一般来说,系统可以使用消息传递代替部分定时任务,两者有很多相似之处,可以相互替换场景。

精华回答 这是初、中级程序猿经常会遇到的问题。他们总喜欢在方法中返回null,因此,在调用这些方法时,也不得不去判空。另外,也许受此习惯影响,他们总潜意识地认为,所有的返回都是不可信任的,为了保护自己程序,就加了大量的判空。 吐槽完毕,回到这个题目本身: 进行判空前,请区分以下两种情况: 1、null 是一个有效有意义的返回值(Where null is a valid response in terms of the contract; and) 2、null是无效有误的(Where it isn't a valid response.) 你可能还不明白这两句话的意思,不急,继续往下看,接下来将详细讨论这两种情况 先说第2种情况 null就是一个不合理的参数,就应该明确地中断程序,往外抛错误。这种情况常见于api方法。例如你开发了一个接口,id是一个必选的参数,如果调用方没传这个参数给你,当然不行。你要感知到这个情况,告诉调用方“嘿,哥们,你传个null给我做甚"。 相对于判空语句,更好的检查方式有两个 (1)assert语句,你可以把错误原因放到assert的参数中,这样不仅能保护你的程序不往下走,而且还能把错误原因返回给调用方,岂不是一举两得。(原文介绍了assert的使用,这里省略) (2)也可以直接抛出空指针异常。上面说了,此时null是个不合理的参数,有问题就是有问题,就应该大大方方往外抛。 第1种情况会更复杂一些。 这种情况下,null是个”看上去“合理的值,例如,我查询数据库,某个查询条件下,就是没有对应值,此时null算是表达了“空”的概念。 这里给一些实践建议: 1、假如方法的返回类型是collections,当返回结果是空时,你可以返回一个空的collections(empty list),而不要返回null,这样调用侧就能大胆地处理这个返回,例如调用侧拿到返回后,可以直接print list.size(),又无需担心空指针问题。(什么?想调用这个方法时,不记得之前实现该方法有没按照这个原则?所以说,代码习惯很重要!如果你养成习惯,都是这样写代码(返回空collections而不返回null),你调用自己写的方法时,就能大胆地忽略判空) 2、返回类型不是collections,又怎么办呢? 那就返回一个空对象(而非null对象),下面举个“栗子”,假设有如下代码

public interface Action {
  void doSomething();}
 
public interface Parser {
  Action findAction(String userInput);}

其中,Parse有一个接口FindAction,这个接口会依据用户的输入,找到并执行对应的动作。假如用户输入不对,可能就找不到对应的动作(Action),因此findAction就会返回null,接下来action调用doSomething方法时,就会出现空指针。

解决这个问题的一个方式,就是使用Null Object pattern(空对象模式) 改造后 类定义如下,这样定义findAction方法后,确保无论用户输入什么,都不会返回null对象

public class MyParser implements Parser {
  private static Action DO_NOTHING = new Action() {
    public void doSomething() { /* do nothing */ }
  };
 
  public Action findAction(String userInput) {
    // ...
    if ( /* we can't find any actions */ ) {
      return DO_NOTHING;
    }
  }}
对比下面两份调用实例 1、冗余:每获取一个对象,就判一次空
Parser parser = ParserFactory.getParser();
if (parser == null) {
  // now what?
  // this would be an example of where null isn't (or shouldn't be) a valid response
}
Action action = parser.findAction(someInput);
if (action == null) {
  // do nothing} else {
  action.doSomething();}

2、精简

ParserFactory.getParser().findAction(someInput).doSomething();

因为无论什么情况,都不会返回空对象,因此通过findAction拿到action后,可以放心地调用action的方法。

其他回答精选:

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

例如使用:

"bar".equals(foo)

而不是

foo.equals("bar")
2、Java8或者guava lib中,提供了Optional类,这是一个元素容器,通过它来封装对象,可以减少判空。不过代码量还是不少。不爽。 3、如果你想返回null,请停下来想一想,这个地方是否更应该抛出一个异常。

原文标题:为什么不建议你用去 “! = null” 做判空?

文章出处:【微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

审核编辑:彭菁

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7637

    浏览量

    148462
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66747
  • null
    +关注

    关注

    0

    文章

    17

    浏览量

    3692

原文标题:为什么不建议你用去 “! = null” 做判空?

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    英飞凌MEMTOOL软件介绍使用方法

    ,附件中详细介绍了这款软件支持的操作系统平台、支持烧录的英飞凌MCU系列和具体型号,并详细介绍了软件的使用方法。MEMTOOL软件介绍使用方法
    发表于 12-14 09:39

    Modelsim详细使用方法

    Modelsim 详细使用方法介绍。点击下载
    发表于 04-23 10:28

    全面介绍docker的使用方法

    docker使用方法
    发表于 07-25 14:22

    介绍示波器的特殊使用方法

    本文介绍了示波器的特殊使用方法
    发表于 05-06 10:36

    介绍独立按键基本的使用方法

    独立按键基本的使用方法——状态机(有人也喜欢用三行代码的方法。当然这都无所谓,萝卜白菜各有所爱,只要别用主时序给按键消抖就行!)1、要使用独立按键,那么开发板上的J5跳帽必须接到BTN(独立按键)。...
    发表于 01-06 06:30

    介绍SPI的使用方法

    写在最前使用RT-Thread Studio开发环境开发STM32单片机程序,与MDK使用env有一定的差别,对于刚开始使用的程序员来说,主要是找不到配置选项在哪里,上一篇介绍了TIM设备的使用方法
    发表于 02-17 06:32

    MFC中ASSERT常见用法

      在C++的消息公告板上经常可以看到出现ASSERT错误的求助信息。虽然这通常是希望消除ASSERT错误的帮助请求,但是几乎所有的求助者都认为ASSERT本身是罪恶的。我完全能理解一
    发表于 09-07 15:55 19次下载

    示波器的使用方法

    示波器的使用方法 1 示波器使用        本节介绍示波器的使用方法。示波器种类、型号很多,功能也不同。
    发表于 01-14 13:06 1.8w次阅读

    固定流动电子狗使用方法介绍

    固定流动电子狗使用方法介绍,感兴趣的小伙伴可以看看。
    发表于 07-28 10:21 6次下载

    钳型表如何使用_钳型表使用方法图解大全

    本文介绍了什么是钳形表以及钳形表结构及原理,其次介绍了 钳形表使用要点与钳形表的使用方法图解,最后介绍了DT266型电流钳形表使用方法
    发表于 01-19 11:39 9.9w次阅读
    钳型表如何使用_钳型表<b class='flag-5'>使用方法</b>图解大全

    助焊膏怎么用_助焊膏的使用方法

    助焊膏在我们生活中已经得到普遍运用,本文主要介绍了助焊膏种类和助焊膏的作用,其次阐述了助焊膏的使用方法,最后介绍了助焊膏的选择要求。
    发表于 02-27 11:25 5.4w次阅读

    面包板的结构和使用方法详细介绍

    面包板是实验室中用于搭接电路的重要工具,熟练掌握面包板的使用方法是提高实验效率,减少实验故障出现几率的重要基础之一。下面就面包板的结构和使用方法做简单介绍
    发表于 10-31 08:00 0次下载
    面包板的结构和<b class='flag-5'>使用方法</b>详细<b class='flag-5'>介绍</b>

    浅谈STM32CubeMX使用方法及功能介绍

    STM32CubeMX使用方法及功能介绍
    的头像 发表于 03-25 11:02 1.1w次阅读
    浅谈STM32CubeMX<b class='flag-5'>使用方法</b>及功能<b class='flag-5'>介绍</b>

    示波器的使用方法(三):示波器的使用方法详解

    示波器的使用方法并非很难,重点在于正确使用示波器的使用方法。往期文章中,小编对模拟示波器的使用方法和数字示波器的使用方法均有所介绍。为增进大
    的头像 发表于 12-24 20:37 2475次阅读

    WinCC中定时器使用方法介绍

    WinCC中定时器使用方法介绍说明。
    发表于 04-22 14:50 8次下载