为什么此代码有效?
Float testFloat = null;
Float f = true ? null : 0f;
为什么这会引发异常?
Float testFloat = null;
Float f = true ? testFloat : 0f;
但是最奇怪的是,该代码也可以成功运行,没有任何异常:
Float testFloat = null;
Float f = testFloat;
看来Java的三元运算符会改变行为。有人可以解释为什么吗?
该行为在JLS-
条件运算符中
指定:
如果第二和第三个操作数中的一个是原始类型T的,并且其他的类型是施加装箱转换(§5.1.7)到T的结果,则 条件表达式的类型为T 。
强调我的。因此,在第二种情况下:
Float f = true ? testFloat : 0f;
由于第三个操作数是基本类型(T
),因此表达式的类型将是浮点类型- T
。因此, 取消 当前引用的 testFloat的 装箱 将导致
NPE 。null``float
__
对于第一种情况,相关部分是最后一部分:
否则,第二和第三操作数分别为S1和S2类型。令T1为对S1进行装箱转换所产生的类型,而T2为对S2进行装箱转换所产生的类型。条件表达式的类型是将捕获转换(§5.1.10)应用于lub(T1,T2)(§15.12.2.7)的结果。
因此,根据此:
null type - S1
float - S2
null type - T1 (boxing null type gives null type)
Float - T2 (float boxed to Float)
然后条件表达式的类型变为- Float
。没有null
需要的拆箱,因此没有NPE
。
但最奇怪的是,这段代码也在没有任何异常的情况下成功运行: 看起来Java的三元运算符改变了行为。有人能解释一下这是为什么吗?
问题内容: 请考虑以下代码片段: 据我所知(以及我的IDE可以告诉我的),变量和应该是等效的。 如您所料,我宁愿写最后2行而不是前7行。但是,当我向该方法传递3个空值时,在变量的计算上得到了NPE 。 有人知道这怎么可能吗?即使条件不满足,三元运算符也会评估第二部分吗? (Java版本1.6.0_21) 问题答案: 尝试: 要么 三元运算符的交替边的类型是和,这意味着将get取消装箱到,然后在赋值
为什么第一次计算的结果比第二次计算的结果大? 结果:
所以我更新了代码,添加了行所做的是将主线程置于Hibernate状态一段时间,因此jvm可以获得一些时间来创建一个新线程。我正在得到我的预期输出
我正在使用Mapstruct映射将一个POJO转换为另一个POJO模型 以下是mapstruct自动生成的方法 该方法基本上获取源POJO的映射,并将其转换为目标模型的映射。生成正在通过。 当我运行代码时,我在这个方法中得到了ClassCast异常:HeaderAttributeGenericDataTypeMaptoStringEnergiectAttributeDataMap 堆栈跟踪: 我还
你认为这个表达的结果是什么? 不!!!是15! 现在让我们看看另一个类似的说法: 还是不,现在是10。为什么呢?我不明白。但是等等,还有两个: 最后一点: 那么有人能告诉我们为什么javascript会这样吗?