for循环内缺少return语句

时间:2019-05-21 12:33:30

标签: java loops return

我可以找到与此类似的问题,但是我找不到针对这种特殊情况的期望答案。

public int getIndex(){
    for(int x = 0; x < 5; x++) {
        return x;
    }
}

执行此代码时,出现编译错误,提示“ Missing return statement”。但是,据我所知,很显然,for循环中的代码将在首次执行x = 0时毫无疑问地执行。因此,对于这种特殊情况,没有理由不执行for循环内的代码。 那么,为什么还要在for循环之外声明一个额外的return语句呢?

5 个答案:

答案 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语句。