首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动解装箱需要三值if-否则

自动解装箱需要三值if-否则
EN

Stack Overflow用户
提问于 2020-03-04 11:30:59
回答 4查看 829关注 0票数 24

这段代码运行良好:-

代码语言:javascript
复制
    Integer nullInt = null;
    if (1 <= 3) {
        Integer secondNull = nullInt;
    } else {
        Integer secondNull = -1;
    }
    System.out.println("done");

但这会引发空指针异常,同时Eclipse警告需要自动取消装箱:-

代码语言:javascript
复制
    Integer nullInt = null;
    Integer secondNull = 1 <= 3 ? nullInt : -1;
    System.out.println("done");

为什么是这样,有人能指点一下吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-03-04 11:34:08

三元条件表达式的类型

代码语言:javascript
复制
1 <= 3 ? nullInt : -1

int ( JLS包含几个表,根据第二个和第三个操作数的类型描述三元条件运算符的类型)。

因此,当它试图将nullInt解压缩为int时,会引发一个NullPointerException

为了获得您的if-else代码段的行为,您需要编写:

代码语言:javascript
复制
1 <= 3 ? nullInt : Integer.valueOf(-1)

现在表达式的类型将是Integer,因此不需要取消装箱。

票数 22
EN

Stack Overflow用户

发布于 2020-03-04 11:39:20

我很确定三元操作符的参数必须是相同类型的。由于您使用了-1和一些常量的nullint编译器,所以尝试打开nullint以获得值。然后自动装箱将其存储在secondNull变量中。

票数 3
EN

Stack Overflow用户

发布于 2020-03-04 11:41:49

这是因为当条件运算符? :的两个操作数是基元类型及其装箱引用类型时,将完成取消装箱转换(JLS第15.25.2节):

数值条件表达式的类型确定如下:

  • ..。
  • 如果第二个和第三个操作数中的一个是原始类型T,而另一个操作数是应用装箱转换(§5.1.7)到T的结果,那么条件表达式的类型是T。

通常,用if表达式替换? :语句并不总是保留代码的意义,因为? :表达式本身需要编译时类型。这意味着当两个操作数的类型不同时,必须将其转换为一个或两个操作数,以便结果具有一致的编译时类型。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60525084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档