Java 中 null > 0 为什么要报错,怎么用语法糖或者 JDK 封装的方法避免

2023-05-19 16:13:40 +08:00
 yibo2018
if (a > 0) { }

if (Objects.compare(a, 0L, Long::compareTo) > 0) {        }

Exception in thread "main" java.lang.NullPointerException

上面这样写如果 a 是 null 就都会报错

一般写法是这样可以避免

if (a != null && a > 0) { }
···

但我实在不想每次遇到都写一遍判空逻辑
null 和 0 本来就不相等,为啥还要报错
我想找一个 JDK 封装的方法去解决,但没找到
3906 次点击
所在节点    程序员
41 条回复
yibo2018
2023-05-19 16:15:52 +08:00
```
Comparator<Long> comparator = Comparator.nullsFirst(Long::compareTo);
if (comparator.compare(null, 0L) > 0) {
```

chat gpt 的答案
xiaohundun
2023-05-19 16:21:17 +08:00
那你不用包装类,考虑处理 0 值呢?
JYii
2023-05-19 16:22:54 +08:00
Optional.ofNullable(a)
.filter(i -> i > 0)
.ifPresentOrElse("a>0", "a is null || a<=0");
xiaohundun
2023-05-19 16:23:02 +08:00
@xiaohundun 我的意思是这本来就是包装类和原始类型的区别,别人用包装类是因为 null 和 0 有不一样的逻辑,而你这里看起来 null 、0 是一样的逻辑,那你完全可以不用包装类,那就不用判空了
nitmali
2023-05-19 16:23:22 +08:00
Optional.ofNullable(a).orElse(0) > 0
crazyweeds
2023-05-19 16:28:42 +08:00
我觉得挺好,null 就是 null ,别搞那么多语法糖,没啥用,增加记忆负担。
jmc891205
2023-05-19 16:30:56 +08:00
类型不一样咋比
null > 0 应该返回 true 还是 false 呢
luhongfei66
2023-05-19 16:31:13 +08:00
null 没办法 0 做比较,null 当成大于 0 或者小于 0 都不适合,编译器怎么能知道你的业务呢
nothingistrue
2023-05-19 16:32:46 +08:00
去了解一下基本类型的自动封装解装。你这本事就是语法糖弄出来的问题,在想加新的语法糖就只会越加问题越多。
hidemyself
2023-05-19 16:35:12 +08:00
你要先定义 null 和 0 的关系,才能给你继续,否则只能给你 NPE
SilentRhythm
2023-05-19 16:40:00 +08:00
3L 正解
yazinnnn
2023-05-19 16:51:32 +08:00
null>0
false

null<0
false

null==0
false

null>=0
true

null<=0
true

--------
js 行为
koloonps
2023-05-19 16:53:31 +08:00
基本数据类型才能够直接比较大小,Integer 比较大小会自动转 int.null 没有对应的值自然会 NPE.jdk1.5 开始支持泛型和自动装箱拆箱,这个版本之后才会有 NPE 问题
Leviathann
2023-05-19 16:58:05 +08:00
因为 null 是 null 类型的单例
而一般的强类型语言只有数字相关的类型才支持 compare 运算符

所以是支持类型自动转换的弱类型语言或者是支持操作符重载的语言才能做到
momocraft
2023-05-19 16:58:56 +08:00
JS 自动乱转被黑了一亿年 建议学用 Optional
coyoteer
2023-05-19 16:59:31 +08:00
直接 if (a && a > 0) { }不行吗
yibo2018
2023-05-19 17:00:51 +08:00
@coyoteer 当然可以,但是我经常忘记 a 判空
CDuXZMAPgHp1q9ew
2023-05-19 17:05:39 +08:00
明确不能为 null 的为什么不用 long 要用 Long 呢
nba2k9
2023-05-19 17:11:51 +08:00
Java 好就好在没有那么多语法糖
yibo2018
2023-05-19 17:12:17 +08:00
@nothingistrue 基本类型的自动封装解装,我目前的理解就是的 int -> Integer 互相自动转换
然后每个基本类型有自己定义对于运算符的逻辑

请问我的理解,你打多少分,100 分满分的话

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

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

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

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

© 2021 V2EX