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

346 天前
 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 封装的方法去解决,但没找到
3571 次点击
所在节点    程序员
41 条回复
yibo2018
346 天前
```
Comparator<Long> comparator = Comparator.nullsFirst(Long::compareTo);
if (comparator.compare(null, 0L) > 0) {
```

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

null<0
false

null==0
false

null>=0
true

null<=0
true

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

所以是支持类型自动转换的弱类型语言或者是支持操作符重载的语言才能做到
momocraft
346 天前
JS 自动乱转被黑了一亿年 建议学用 Optional
coyoteer
346 天前
直接 if (a && a > 0) { }不行吗
yibo2018
346 天前
@coyoteer 当然可以,但是我经常忘记 a 判空
wujichao
346 天前
明确不能为 null 的为什么不用 long 要用 Long 呢
nba2k9
346 天前
Java 好就好在没有那么多语法糖
yibo2018
346 天前
@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