我可以找到与此类似的问题,但是我找不到针对这种特殊情况的期望答案。
public int getIndex(){
for(int x = 0; x < 5; x++) {
return x;
}
}
执行此代码时,出现编译错误,提示“ Missing return statement”。但是,据我所知,很显然,for循环中的代码将在首次执行x = 0时毫无疑问地执行。因此,对于这种特殊情况,没有理由不执行for循环内的代码。 那么,为什么还要在for循环之外声明一个额外的return语句呢?
答案 0 :(得分:10)
与您不同,编译器无法(或更确切地说,不是 try )确定循环至少执行一次。
JLS 14.21中提供了有关此问题的特定规则。特别是:
基本陈述可以正常完成,前提是至少满足以下条件之一:
for语句是可到达的,有一个条件表达式,并且该条件表达式不是值为true的常数表达式(§15.28)。
有一个可到达的中断声明,退出该声明。
包含的语句是可到达的,前提是for语句可到达且条件表达式不是值为false的常量表达式。
您没有常量条件表达式,因此,编译器认为这样的for循环可以正常完成,因此可以访问它之后的语句。
It would work,如果i < 5
是常量表达式,例如true
,则无需进一步的return语句。
public int getIndex(){
for(int x = 0; true; x++) {
return x;
}
}
考虑到有关可达性的更为复杂的规则,编译器可以确定您的原始循环永远不会正常完成,但是这种情况的实际用例非常小,以致于无法证明其复杂性。
答案 1 :(得分:2)
这是因为JVM不知道您将在循环内使用条件中断。例如:
public static int getIndex(){
for(int x=0; x<5;x++){
if(x<5) continue;
return x;
}
return 6;
}
很明显,如果没有循环外的返回,您可能会错过循环内的return语句
答案 2 :(得分:0)
我建议您的示例不是真实的,但是您可以将其更改为在执行时不会出现编译错误:
public static int getIndex() {
int x = 0;
do {
return x++;
} while (x < 5);
}
答案 3 :(得分:0)
在您的功能中
-此方法必须返回int类型的结果
错误产生
bcz
public static int getIndex(){
for(int x = 0; x < 5; x++) {
return x;
}
}
没有指定返回值的外部函数 默认返回值
public static int getIndex(){
for(int x = 0; x < 5; x++) {
return x;
}
return 0; <---------
}
答案 4 :(得分:-1)
这些条件在编译时无法理解,而在运行时,JVM可以理解。但是要编译代码,需要在for循环之外使用return语句。因此,要编译代码,理论上必须有一个return语句。