Java注意事项之三元操作符

来源:互联网 发布:如何优化亚马逊关键词 编辑:程序博客网 时间:2024/05/15 08:48

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;}
1 0