V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
marine2c
V2EX  ›  程序员

Java 自动装箱问题求助

  •  
  •   marine2c · 2021-04-28 15:13:07 +08:00 · 1338 次点击
    这是一个创建于 522 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    8 条回复    2021-05-06 15:12:44 +08:00
    geelaw
        1
    geelaw  
       2021-04-28 15:19:32 +08:00 via iPhone
    https://www.v2ex.com/t/655007 #8 非常猥琐的自动拆箱
    dqzcwxb
        2
    dqzcwxb  
       2021-04-28 16:21:31 +08:00
    marine2c
        3
    marine2c  
    OP
       2021-04-28 16:28:01 +08:00 via iPhone
    @geelaw
    @dqzcwxb
    感谢各位老哥科普,我之前就是写 c#转过来的,java 这就很离谱😤
    anzu
        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
    xuanbg
        5
    xuanbg  
       2021-04-29 05:27:22 +08:00
    Java 三元表达式的冒号两边一定要使用相同类型,否则就会闹幺蛾子。。。

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

    当然 C# 里严格来说没有类似的场景,因为 C# 无法表达装箱过的值类型,即不存在 Integer 对应的东西。
    DAM
        7
    DAM  
       2021-04-29 15:30:37 +08:00
    Java8 就要多用新特性
    Integer skillId = Optional.ofNullable(classifyResponse).map(ClassifyResponse::getSkillId).orElse(0);
    beichenhpy
        8
    beichenhpy  
       2021-05-06 15:12:44 +08:00
    三目运算会自动拆箱。。统一一下类型,用 Integer 包裹一下后面的 0
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1663 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 01:20 · PVG 09:20 · LAX 18:20 · JFK 21:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.