Java注意事项之三元操作符
Java中三元操作符(condition ? expression1 : expression2)的值类型是由expression1的类型决定的。这个规则导致三元操作符和基本类型的拆装箱结合使用时,需要特别注意,例如:
Integer nullInteger() {
return null;
}
Integer random0Null() {
Random random = new Random();
return random.nextBoolean() ? 0 : nullInteger();
}
random0Null这个随机返回Integer类型的0或者null的程序就有可能会抛NullPointerException,这是因为:
- random0Null的return语句是三元操作符,它的类型是由0决定的
- 0是int类型的,所以整个return语句是int类型的
- 当nextBoolean()为false时,调用nullInteger()获得null
- null需要调用intValue()拆箱转为int,这是非法操作,抛异常
random0Null实际执行过程是这样的:
Integer random0Null() {
Random random = new Random();
Integer returnValue = null;
if (random.nextBoolean()) {
returnValue = Integer.valueOf(0);
} else {
returnValue = Integer.valueOf(nullInteger().intValue());
}
return returnValue;
}
注意以下代码不会抛异常:
Integer random0Null() {
Random random = new Random();
// 第二个参数是null常量,编译器会根据0和null判断出类型为Integer
return random.nextBoolean() ? 0 : null;
}
Integer random0Null() {
Random random = new Random();
// 表达式类型为nullInteger()返回值类型,是Integer
return !random.nextBoolean() ? nullInteger() : 0;
}