public class TTT1 {
public int test() {
int i;
for( i=0; /*i<5*/; i++) {
if(i == 3) {
return i;
}
}

}

public static void main(String[] args) {
System.out.println(new TTT1().test());
}
}
这样编译没问题 也能运行,但是把for循环的条件注释去掉以后就会出错。 for中的return是不是只有for中认识,为什么去掉for、的条件又会编译成功?

解决方案 »

  1.   

    是这样子的,当你把注释条件去掉之后,编译器只看到你在if()语句有return没有看到在if条件不满足的情况下的return 所以报错,编译器是无法确定你这个if语句一定要发生的
    可以这样改就好了public class TTT1 {
    public int test() {
    int i;
    for (i = 0; i<5 ; i++) {
    if (i == 3) {
    // return i;
    break;
    }
    }
    return i;
    } public static void main(String[] args) {
    System.out.println(new TTT1().test());
    }
    }
      

  2.   

    看起来是这样解释:当for没有在第一行也就是类似for(int i=0;i<5;i++)如i<5这样的限制判断的时候,编译器只能去找方法体当中的break 或者return语句(如果是有返回值),对于有返回值的语句也直接return对应值,不仅结束循环也结束整个方法,因为这是程序唯一的可能出口了,编译器能通过当存在i<5这样的限制判断的时候,编译器考虑到的程序出口有这样几种
    1. break或者return语句,跟上面一样
    2. 本身i<5条件不满足的情况
    在你的例子里面,其实return和i<5两种情况都可能跳出,而又是要求方法有返回值,那么在i<5的时候,你根本没有定义用什么返回值返回(虽然实际情况不可能出现,还是编译器不能那么只能确定在逻辑上不能出现,它只能从语法上分析到可能出现那样情况),所以编译不通过。
    总结一下,是在有i<5与return都可能打断循环的时候,没有为两种情况都准备返回值(程序后面也没有return语句),导致有i<5的时候编译不过
      

  3.   


    for ( i = 0;  ; i++) {
    if (i == 3) {
    return i;
    }

    }
    这样写,for循环如果不执行return语句,就是个死循环,当for循环结束的时候,函数test一定会有返回值的.
    for ( i = 0; i<5 ; i++) {
    if (i == 3) {
    return i;
    }

    }当for循环结束的时候,编译器判断函数test()可能不会有返回值。所以报错。我这样讲对不?
      

  4.   


    break是不是有点多余了……
      

  5.   

    因为Java的编译器complier有几个版本,他们怎么具体实现的我们也很难真正摸清楚,从实验结果反推,这样理解是靠谱的
      

  6.   

    存在i<5的时候,程序退出没有给任何返回值,编译肯定报错,我是这样分析的,你似乎没有理解,你觉得怎么会不报错?
      

  7.   

    简单来说就是编译器不知道你for循环到底能不能return 它只晓得你循环外没有return 所以编译不过