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