cxsz
0.45D
V2EX  ›  Java

被怼的莫名奇妙的,这么写会出空指针?

  •  
  •   cxsz · Mar 19, 2022 · 4827 views
    This topic created in 1699 days ago, the information mentioned may be changed or developed.
    这个我怎么想都觉得不可能出空指针,那不这么写有啥好方法




    说 java 代码中“.”的使用不要 xx.xx.xx 这种写法,但这个地方用 stream 难道不是最好的写法
    24 replies  •  2022-04-29 08:12:11 +08:00
    ikas
    ikas
    Mar 19, 2022❤️2
    1
    如果真的非要说空指针,这里问题不是 xx.xx.xx 写法
    而是,你的 list 包含可能为 null 的 item,然后 getStationId 有可能返回 null,然后再次返回包含 null 的 list
    LxExExl
    LxExExl
    Mar 19, 2022 via iPhone
    2
    mylist?.getFirst()?.getAttribute()?.toString()

    有语法糖的语言可以这样

    java 楼主的截图确实会有空指针问题吧
    那么怎么解决。一路嵌套 if 还是 catch 住异常?
    9c04C5dO01Sw5DNL
    9c04C5dO01Sw5DNL
    Mar 19, 2022❤️2
    3
    stationId 如果事实不可能为空的话,你让他给你造一个 null 出来试试。

    可能为空的话就 filter 一下完事。

    另外,判断 list 是否 empty 有点多余了(前提 list 不为 null )
    cxsz
    cxsz
    OP
    Mar 19, 2022
    4
    @ikas #1 这个确实可能会存在,返回的 list 在操作前也有判空处理,但就单独这行来说,我觉得用 stream 语法糖没啥问题,用循环加判断,一样会存在同样的问题
    kisick
    kisick
    Mar 19, 2022❤️2
    5
    userStationList.add(null);
    这样是有可能空指针的,加个.filter(Objects::nonNull)就好了
    cxsz
    cxsz
    OP
    Mar 19, 2022
    6
    @giiiiiithub #3
    @kisick #5

    好的,感谢
    Hurriance
    Hurriance
    Mar 19, 2022
    7
    应该是 stream().map(null) 这个会 NPE 吧,最近有遇到过
    maojun
    maojun
    Mar 19, 2022 via iPhone
    8
    你列表里的元素如果有 null 的话,调用 getStationId 不就空指针了
    TWorldIsNButThis
    TWorldIsNButThis
    Mar 19, 2022 via iPhone
    9
    可以包一层 optional
    wolfie
    wolfie
    Mar 19, 2022
    10
    userStationList 为什么会包含空?
    cxsz
    cxsz
    OP
    Mar 19, 2022
    11
    @wolfie #10 因为 server 层没拿到数据是会返一个空的
    Suddoo
    Suddoo
    Mar 19, 2022
    12
    集合里的对象全为 null ,遍历集合里每个对象取其中的属性,空指针出现了
    runo
    runo
    Mar 19, 2022 via iPhone
    13
    optional 啊…
    cryboy007
    cryboy007
    Mar 19, 2022
    14
    请先 filter 过滤在 map
    night98
    night98
    Mar 19, 2022
    15
    楼主写的没问题,这个 list 一看就知道是从数据库拿的,也判空 list 了,如果 list 里面还有元素能为空的话,先把数据提供方拉出去打一顿吧。
    wolfie
    wolfie
    Mar 19, 2022
    16
    @cxsz
    为什么 service 的查询返回 List 会存在 null 。
    stream map to IdList 一点问题没有,List 里硬赛一个 null 才是问题。
    daimubai
    daimubai
    Mar 19, 2022
    17
    @ikas 如果有包含为 null 的 item, 在 getStationId 时就已经抛出 NPE 了。 你说的应该是如果有 item 的 stationId 是 null ,才会返回包含 null 的 list
    ikas
    ikas
    Mar 20, 2022
    18
    @daimubai ,对,我说的是 2 种,第一种就是 npe 了,然后第二种可能给后续的代码留坑
    ikas
    ikas
    Mar 20, 2022❤️2
    19
    @cxsz 对的..主要原因是..List 这种结构我们无法判定是否包含 null,本身使用 stream 这种用法没有任何问题,如果别人拿这个说事情其实就是老顽固而已..

    如同其他的回答一样,使用保守写法,加上 filter,然后 getid 里也根据业务加上是否需要剔除 null

    其实这里问题就好多了...
    返回 list 是否可能 null
    如果 getid 如果为 null,是要抛出异常,还是要剔除,这些都是要根据业务的
    ubuntuGary
    ubuntuGary
    Mar 20, 2022❤️1
    20
    如果被怼是理由是你用 Stream 流式的写法,就很没有道理了,list 里有 null 元素,你换成外部迭代写法也一样有可能 NPE ,而如果被怼的原因就是你没考虑 null 元素,那你只能认,不能说 Stream 流式写法不好,Stream 流加个 filter 也就解决了,不过相比你这个问题,上游的 list 里有 null 元素更加不可原谅。
    chainsR
    chainsR
    Mar 21, 2022 via iPhone
    21
    要过滤的,不要相信数据
    rehoni
    rehoni
    Apr 27, 2022
    22
    肯定不是 stream 的问题,就算你 foreach 也会 npe 的,最好确保数据可靠性,给你找了个写法
    [如果整个 list 可能为 null] 用 Optional 包装一下
    [如果 list 中的某个 object 可能为 null] 用 .filter(Objects::nonNull)

    List<Person> personList = new ArrayList<>();
    personList.add(new Person());
    personList.add(null);
    personList.add(new Person("小明", 10));
    personList.add(new Person("小红", 12));

    Optional.ofNullable(personList).orElseGet(() -> {
    System.out.println("personList 为 null !");
    return new ArrayList<>();
    }).stream().filter(Objects::nonNull).forEach(person -> {
    System.out.println(person.getName());
    System.out.println(person.getAge());
    });
    cxsz
    cxsz
    OP
    Apr 28, 2022
    23
    @rehoni #22 好的,谢谢。 已经一个月过去了这个帖子是怎么被翻出来的。。。。
    rehoni
    rehoni
    Apr 29, 2022
    24
    @cxsz 。。。感觉 java 话题下排的很靠前哇。。可能这话题没多少人发帖子吧
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4336 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 55ms · UTC 08:35 · PVG 16:35 · LAX 00:35 · JFK 03:35
    ♥ Do have faith in what you're doing.