for循环内缺少return语句

QAA*_*uto 5 java loops return

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

public int getIndex(){
    for(int x = 0; x < 5; x++) {
        return x;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

And*_*ner 10

与您不同,编译器无法(或者不尝试)确定循环至少执行一次。

有关此问题的特定规则在JLS 14.21中给出。特别是:

如果满足以下至少一项条件,则基本的for语句可以正常完成:

  • for语句是可到达的,存在一个条件表达式,并且该条件表达式不是值为true的常数表达式(第15.28节)。

  • 有一个可达的break语句退出for语句。

如果for语句是可到达的并且条件表达式不是值为false的常量表达式,则包含的语句是可到达的。

您没有常量条件表达式,因此,编译器认为这样的for循环可以正常完成,因此可以访问它之后的语句。

如果i < 5是常量表达式(例如),则无需进一步的return语句就可以工作true

public int getIndex(){
    for(int x = 0; true; x++) {
        return x;
    }
}
Run Code Online (Sandbox Code Playgroud)

给定更复杂的可达性规则,编译器可以确定原始循环永远无法正常完成,但是实际情况如此之小,以致于无法证明其复杂性。