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

2022-03-19 13:10:31 +08:00
 cxsz
这个我怎么想都觉得不可能出空指针,那不这么写有啥好方法




说 java 代码中“.”的使用不要 xx.xx.xx 这种写法,但这个地方用 stream 难道不是最好的写法
3710 次点击
所在节点    Java
24 条回复
ikas
2022-03-19 13:18:46 +08:00
如果真的非要说空指针,这里问题不是 xx.xx.xx 写法
而是,你的 list 包含可能为 null 的 item,然后 getStationId 有可能返回 null,然后再次返回包含 null 的 list
LxExExl
2022-03-19 13:19:56 +08:00
mylist?.getFirst()?.getAttribute()?.toString()

有语法糖的语言可以这样

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

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

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

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

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

其实这里问题就好多了...
返回 list 是否可能 null
如果 getid 如果为 null,是要抛出异常,还是要剔除,这些都是要根据业务的
ubuntuGary
2022-03-20 22:39:53 +08:00
如果被怼是理由是你用 Stream 流式的写法,就很没有道理了,list 里有 null 元素,你换成外部迭代写法也一样有可能 NPE ,而如果被怼的原因就是你没考虑 null 元素,那你只能认,不能说 Stream 流式写法不好,Stream 流加个 filter 也就解决了,不过相比你这个问题,上游的 list 里有 null 元素更加不可原谅。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/841447

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX