当前位置: 首页 > 知识库问答 >
问题:

奇怪的Java行为。三值运算符

路和悌
2023-03-14
Float testFloat = null;
Float f = true ? null : 0f;
Float testFloat = null;
Float f = true ? testFloat : 0f;

但最奇怪的是,这段代码也在没有任何异常的情况下成功运行:

Float testFloat = null;
Float f = testFloat;

看起来Java的三元运算符改变了行为。有人能解释一下这是为什么吗?

共有1个答案

吉鸿宝
2023-03-14

行为在JLS条件运算符中指定:

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

强调我的。因此,在2nd的情况下:

Float f = true ? testFloat : 0f;
null type - S1
float     - S2

null type - T1 (boxing null type gives null type)
Float     - T2 (float boxed to Float)
 类似资料:
  • 问题内容: 为什么此代码有效? 为什么这会引发异常? 但是最奇怪的是,该代码也可以成功运行,没有任何异常: 看来Java的三元运算符会改变行为。有人可以解释为什么吗? 问题答案: 该行为在JLS- 条件运算符中 指定: 如果第二和第三个操作数中的一个是原始类型T的,并且其他的类型是施加装箱转换(§5.1.7)到T的结果,则 条件表达式的类型为T 。 强调我的。因此,在第二种情况下: 由于第三个操作

  • 问题内容: 请考虑以下代码片段: 据我所知(以及我的IDE可以告诉我的),变量和应该是等效的。 如您所料,我宁愿写最后2行而不是前7行。但是,当我向该方法传递3个空值时,在变量的计算上得到了NPE 。 有人知道这怎么可能吗?即使条件不满足,三元运算符也会评估第二部分吗? (Java版本1.6.0_21) 问题答案: 尝试: 要么 三元运算符的交替边的类型是和,这意味着将get取消装箱到,然后在赋值

  • 为什么第一次计算的结果比第二次计算的结果大? 结果:

  • 所以我更新了代码,添加了行所做的是将主线程置于Hibernate状态一段时间,因此jvm可以获得一些时间来创建一个新线程。我正在得到我的预期输出

  • 我正在使用Mapstruct映射将一个POJO转换为另一个POJO模型 以下是mapstruct自动生成的方法 该方法基本上获取源POJO的映射,并将其转换为目标模型的映射。生成正在通过。 当我运行代码时,我在这个方法中得到了ClassCast异常:HeaderAttributeGenericDataTypeMaptoStringEnergiectAttributeDataMap 堆栈跟踪: 我还

  • 你认为这个表达的结果是什么? 不!!!是15! 现在让我们看看另一个类似的说法: 还是不,现在是10。为什么呢?我不明白。但是等等,还有两个: 最后一点: 那么有人能告诉我们为什么javascript会这样吗?