Integer skillId = Objects.nonNull(classifyResponse) ? classifyResponse.getSkillId() : 0; getSkillId 返回一个 Integer 对象,为空就会报空指针异常,但是我?后面直接写 null 就不会报异常为什么? java8 版本。
1
geelaw 2021-04-28 15:19:32 +08:00 via iPhone
https://www.v2ex.com/t/655007 #8 非常猥琐的自动拆箱
|
2
dqzcwxb 2021-04-28 16:21:31 +08:00
https://juejin.cn/post/6872738517798584328
自动拆箱导致的 bug |
3
marine2c OP |
4
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 |
5
xuanbg 2021-04-29 05:27:22 +08:00
Java 三元表达式的冒号两边一定要使用相同类型,否则就会闹幺蛾子。。。
C#你没发现根本不允许你这么写吗?如果冒号两边一个可为空一个不可为空,vs 会提示你需要类型转换。 |
6
geelaw 2021-04-29 12:33:56 +08:00 via iPhone
@xuanbg #5 C# 表达式 true ? (int)0 : (int?)null 合法,所以不理解最后一句是什么。
当然 C# 里严格来说没有类似的场景,因为 C# 无法表达装箱过的值类型,即不存在 Integer 对应的东西。 |
7
DAM 2021-04-29 15:30:37 +08:00
Java8 就要多用新特性
Integer skillId = Optional.ofNullable(classifyResponse).map(ClassifyResponse::getSkillId).orElse(0); |
8
uselessVisitor 2021-05-06 15:12:44 +08:00
三目运算会自动拆箱。。统一一下类型,用 Integer 包裹一下后面的 0
|