Java while循环中boolean与Boolean作为条件的不可达代码差异问题
问题解答
核心原因
这个差异是Java语言规范(JLS)对编译时常量表达式和循环可达性判断的明确规定导致的:
Java编译器在做while循环体的可达性检查时,只有当循环条件是值为false的编译时常量表达式时,才会判定循环体不可达,抛出编译错误。
各变量差异说明
触发编译错误的flag1、flag3、flag5
这三个变量都是boolean基本类型,被final修饰,且赋值的是编译阶段就能确定值的常量表达式,完全符合编译时常量的要求:
flag1直接赋值false常量flag3赋值!true,属于编译阶段可计算结果的常量表达式flag5赋值10 >= 20,同样是编译阶段可计算结果的常量表达式
三者的值在编译期就被确定为false,所以会触发不可达语句的编译错误。
不触发编译错误的flag2、flag4、Boolean.FALSE
这三个值的类型都是Boolean包装类型,而JLS明确规定:编译时常量表达式的类型只能是基本数据类型或者String类型,包装类型不属于该范畴,因此编译器在做可达性分析时,不会解析它们的实际值:
flag2是Boolean类型,赋值的是Boolean.parseBoolean()方法的返回值,编译阶段无法确定运行时结果,自然不会判定不可达flag4虽然赋值源100 == 20是值为false的基本类型常量,但赋值给Boolean类型时会自动装箱为包装对象,不属于编译时常量Boolean.FALSE是Boolean类的静态成员常量,本质仍是包装类型的对象,同样不属于编译时常量表达式范畴
哪怕开发者可以直观判断这三个条件的值都是false,编译器也不会触发不可达的编译错误。
内容的提问来源于stack exchange,提问作者Lokeshwar Tailor
相关产品推荐
相关产品推荐

