我有一个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
?
答案 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)
如果声明某个方法具有返回类型,则如果该方法的主体可以正常完成(§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;
}
它会起作用