可能重复:
布尔值,条件运算符和自动装箱
Java,Google Collections Library; AbstractIterator有问题吗?
下面的代码产生一个NPE:
Integer test = null;
Integer test2 = true ? test : 0;
System.out.println(test2);
Run Code Online (Sandbox Code Playgroud)
要正确打印出"null"而无异常,需要以下代码:
Integer test = null;
Integer test2 = true ? test : (Integer)0;
System.out.println(test2);
Run Code Online (Sandbox Code Playgroud)
在第一个例子中显而易见的是,"test"被取消装箱(转换为原生int),但为什么呢?为什么更改三元运算符中的另一个表达式(如第二个示例中)修复它?任何人都可以提供某种形式的叙述,确切地知道两个例子中的内容何时,什么以及为何被盒装和取消装箱?
Jon*_*eet 18
条件表达式的类型确定如下:
- 如果第二个和第三个操作数具有相同的类型(可以是null类型),那么这就是条件表达式的类型.
- 如果第二个和第三个操作数之一是boolean类型,另一个类型是Boolean类型,那么条件表达式的类型是boolean.
- 如果第二个和第三个操作数之一是null类型而另一个操作数的类型是引用类型,则条件表达式的类型是该引用类型.
- 否则,如果第二个和第三个操作数具有可转换(第5.1.8节)到数字类型的类型,则有几种情况:
- 如果其中一个操作数的类型为字节或字节,另一个操作数的类型为short或Short,则条件表达式的类型为short.
- 如果其中一个操作数是T类型,其中T是byte,short或char,另一个操作数是int类型的常量表达式,其值可以在类型T中表示,那么条件表达式的类型是T.
- 如果其中一个操作数是Byte类型而另一个操作数是int类型的常量表达式,其值可以在byte类型中表示,则条件表达式的类型是byte.
- 如果其中一个操作数的类型为Short,另一个操作数是int类型的常量表达式,其值可在short类型中表示,则条件表达式的类型为short.
- 如果其中一个操作数是类型的; 字符和另一个操作数是int类型的常量表达式,其值可以在char类型中表示,然后条件表达式的类型是char.
- 否则,二进制数字提升(第5.6.2节)将应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型.请注意,二进制数字促销执行拆箱转换(第5.1.8节)和值集转换(第5.1.13节).
所以它遵循最后一个子弹,执行二进制数字促销,执行拆箱转换.所以条件运算符表达式的类型是int,即使你将它分配给一个Integer.它正在尝试执行拆箱转换null,因此例外.
| 归档时间: |
|
| 查看次数: |
3092 次 |
| 最近记录: |