在for循环中缺少return语句

时间:2014-02-15 15:12:30

标签: java arrays for-loop methods return

我有一个for循环,它返回数组中的值。

public static String getPieces(){
        for(int y=0; y<=7; y++)
            for(int x=0; x<=7; x++)
                return piece[x][y];
}

方法中有一个返回语句,每次调用时都会返回。为什么会说missing return statement

3 个答案:

答案 0 :(得分:3)

除了loop完全没有意义(因为它会返回片段[0] [0]),添加额外的返回行可能对你有帮助:

public static String getPieces(){
        for(int y=0; y<=7; y++){
            for(int x=0; x<=7; x++){
                return piece[x][y];
            }
        }

}

由于您声明要返回64个值,因此您必须返回一个数组。

public static ArrayList<String> getPieces(){
    ArrayList<String> strings = new ArrayList<String>();
    for(int y = 0; y <= 7; y++){
        for(int x = 0; x <= 7; x++){
            strings.add(piece[x][y]);
        }
    }
    return strings;
}

答案 1 :(得分:3)

JLS §8.4.7. Method Body 说:

  

如果声明某个方法具有返回类型,则如果该方法的主体可以正常完成(§14.1),则会发生编译时错误。

正常完成的定义不会突然竞争return语句可以突然完成

接下来,假设for语句的语法:

for ( ForInit_opt ; Expression_opt ; ForUpdate_opt ) Statement

JLS §14.14.1.2. Iteration of for Statement 声明:

  

接下来,执行迭代步骤,如下所示:

     
      
  • 如果存在 Expression ,则会对其进行评估。如果结果属于Boolean类型,则需要进行拆箱转换(第5.1.8节)。

         
        
    • 如果对 Expression 或后续拆箱转换(如果有)的评估突然完成,for语句会因同样的原因而突然完成
    •   
  •   

因此, Expression 突然完成的事实意味着for循环也将突然完成,原因相同,当然不是“返回”。因此,return语句可能无法访问。

然而,我们都知道它会永远达成。但这是编译器智能的缺点。如果删除表达式(它们是可选的),或用true替换它们,编译器不会抱怨。你的代码基本上是这样的:

// This snippet won't work as method body
for (int i = 0; i < 10; ++i)
{
    return "Hello"; 
}

与此相比:

// This snippet compiles fine
for (int i = 0; true; ++i)
{
    return "Hello";
}

这意味着有两种选择:

  • i < 10可以突然完成
  • 即使您声明i <= 10,编译器也无法确定是否将int i = 0评估为true。

我在搜索JLS时没有找到任何关于突然完成简单i < 10语句的内容。所以,我猜这种情况发生的原因实际上是第二个:他无法确定i < 10至少会评估true一次。


所以,为了让编译器关闭他不确定实际被调用的return语句的事实,你可以让方法自己完成突然

for (int i = 0; i < 10; ++i)
{
    return "Hello"; 
}
throw new RuntimeException("Should never, ever, reach this point!");

答案 2 :(得分:0)

因为return语句在for块下。

如前所述,返回类型为String,您的方法必须返回tye。但是你的程序编译器事先并不知道流不会进入for循环而且不可能返回。因此编译器更加智能。不是吗:)。

尝试

public static String getPieces(){
       String result = null;
        for(int y=0; y<=7; y++)
            for(int x=0; x<=7; x++)
                result= piece[x][y];

        return result;
}

它会起作用