给出以下代码示例:
public class WeirdStuff {
public static int doSomething() {
while(true);
}
public static void main(String[] args) {
doSomething();
}
}
这是一个有效的 Java 程序,尽管方法 doSomething() 应该返回一个 int 但从未返回。如果运行它,它将以无限循环结束。如果将 while 循环的参数放在单独的变量中(例如 boolean bool = true),编译器会告诉您在此方法中返回 int。
所以我的问题是:这是 Java 规范中的某个地方吗?在某些情况下这种行为可能有用吗?
我只引用Java语言规范 http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21,因为这一点相当清楚:
本节专门对“可达”一词进行精确解释。这个想法是,从包含语句的构造函数、方法、实例初始化程序或静态初始化程序的开头到语句本身,必须存在一些可能的执行路径。分析考虑了陈述的结构。除了对条件表达式具有常量值 true 的 while、do 和 for 语句的特殊处理,流分析中不考虑表达式的值。
...
while 语句可以正常完成,当且仅当满足以下至少一项条件:
- while 语句可达,且条件表达式不是值为 true 的常量表达式。
- 有一个可到达的break语句退出while语句。
...
不是 switch 块的非空块中的所有其他语句 S 都是可达的,前提是 S 之前的语句可以正常完成。
然后将上面的定义应用到this http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.7-230:
如果方法被声明为具有返回类型,则其主体中的每个返回语句(第 14.17 节)都必须有一个表达式。如果方法主体可以正常完成,则会发生编译时错误(第 14.1 节)。
换句话说,具有返回类型的方法必须只能通过使用提供返回值的 return 语句来返回;不允许“身体末端掉下来”。
请注意,方法可能具有声明的返回类型但不包含返回语句。这是一个例子:
class DizzyDean {
int pitch() { throw new RuntimeException("90 mph?!"); }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)