Java中if(true)内return不报错但return后写语句报错的原因咨询
Java 不可达语句编译规则说明
问题核心前提
Java编译器的不可达语句检查不是自由实现的,完全遵循《Java语言规范(JLS)》的明确约束,没有权限自己额外加校验规则。
代码2触发编译错误的原因
public class HelloWorld{ public static void main(String []args){ m1(); } public static String m1() { return ""; System.out.println("last statement"); //compile error : unreachable statement } }
JLS明确规定:return、throw这类会直接终止方法执行的语句,其后的所有语句都属于强制检查的不可达语句,只要出现就直接判定为语法错误。这段代码里return ""已经结束了方法的执行流程,后面的打印语句100%不可能执行,所以编译器会直接报错。
代码1的else分支不可达却不报错的原因
public class HelloWorld{ public static void main(String []args){ m1(); } public static String m1() { if(true){ System.out.println("if"); return ""; //line 1 } else { System.out.println("else"); // line 2 return ""; } } }
这是JLS专门为if语句设置的豁免规则:如果if的判断条件是常量表达式(这里的true就是典型的布尔常量表达式),编译器不会校验else分支的可达性。
这个规则的设计目的是支持开发过程中的条件开关场景:比如我们经常会定义类似public static final boolean DEBUG = true的常量,通过修改这个常量值来切换调试模式和正式模式,如果编译器强制校验这类if的分支可达性,那每次修改常量值都会导致另一个分支报不可达错误,严重影响开发效率,所以Java规范特意在此处放宽了校验要求。
注意:不是编译器没有能力识别else分支不可达,是规范明确要求它不能在这里抛出错误。
内容的提问来源于stack exchange,提问作者pathe.kiran
相关产品推荐
相关产品推荐

