Java 自动装箱问题求助

2021-04-28 15:13:07 +08:00
 marine2c

Integer skillId = Objects.nonNull(classifyResponse) ? classifyResponse.getSkillId() : 0; getSkillId 返回一个 Integer 对象,为空就会报空指针异常,但是我?后面直接写 null 就不会报异常为什么? java8 版本。

1655 次点击
所在节点    程序员
8 条回复
geelaw
2021-04-28 15:19:32 +08:00
https://www.v2ex.com/t/655007 #8 非常猥琐的自动拆箱
dqzcwxb
2021-04-28 16:21:31 +08:00
marine2c
2021-04-28 16:28:01 +08:00
@geelaw
@dqzcwxb
感谢各位老哥科普,我之前就是写 c#转过来的,java 这就很离谱😤
anzu
2021-04-28 16:36:30 +08:00
根据下面的表格,你的 Conditional expression type 是 int
https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25
xuanbg
2021-04-29 05:27:22 +08:00
Java 三元表达式的冒号两边一定要使用相同类型,否则就会闹幺蛾子。。。

C#你没发现根本不允许你这么写吗?如果冒号两边一个可为空一个不可为空,vs 会提示你需要类型转换。
geelaw
2021-04-29 12:33:56 +08:00
@xuanbg #5 C# 表达式 true ? (int)0 : (int?)null 合法,所以不理解最后一句是什么。

当然 C# 里严格来说没有类似的场景,因为 C# 无法表达装箱过的值类型,即不存在 Integer 对应的东西。
DAM
2021-04-29 15:30:37 +08:00
Java8 就要多用新特性
Integer skillId = Optional.ofNullable(classifyResponse).map(ClassifyResponse::getSkillId).orElse(0);
uselessVisitor
2021-05-06 15:12:44 +08:00
三目运算会自动拆箱。。统一一下类型,用 Integer 包裹一下后面的 0

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

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

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

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

© 2021 V2EX