Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不能将条件添加到外部循环_Java_Loops - Fatal编程技术网

Java 为什么不能将条件添加到外部循环

Java 为什么不能将条件添加到外部循环,java,loops,Java,Loops,这是我的演示,非常简单,但我无法添加到外循环I中,因为: for(int i = 0; ; i++) { } 这实际上类似于 int i = 0; while (true) { ... i++ } 编译器知道,这是一个无限循环 但是, for(int i = 0; i < 10; i++) { } // what to return here? for(int i=0;i

这是我的演示,非常简单,但我无法添加到外循环
I中,因为:

for(int i = 0; ; i++) {
}
这实际上类似于

int i = 0;
while (true) {
    ...
    i++
}
编译器知道,这是一个无限循环

但是,

for(int i = 0; i < 10; i++) {
}
// what to return here?
for(int i=0;i<10;i++){
}
//在这里返回什么?

此循环完成时,编译器需要返回字符串。对于
,它并没有真正进入第二个
的内部,而是知道它将在第一次进入时返回。它不会计算第二个循环,正如Jaroslaw Pawlak所暗示的那样,因为如果向外部循环添加条件,则应至少向调用者返回一个字符串类型的返回保证,因此代码应如下所示:

public String testFor() {
     for (int i = 0; i < 10; i++) {
         for (int j = 0; j < 10; j++) {
              return "success";
          }
     }
     return null;
}
公共字符串testFor(){
对于(int i=0;i<10;i++){
对于(int j=0;j<10;j++){
返回“成功”;
}
}
返回null;
}

编辑:当我回答时,代码看起来不一样

public String testFor()
{
    for (int i = 0;; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            return "success";
        }
    }
}
公共字符串testFor()
{
对于(int i=0;i++)
{
对于(int j=0;j<10;j++)
{
返回“成功”;
}
}
}

这段代码也适用。“j++”是死代码,因为我们在返回“成功”之前只进入内部循环一次;这方面的相关部分是:

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

(这是一个稍微令人困惑的术语;它基本上意味着在不执行
返回
抛出
系统退出
语句的情况下完成)

和。这方面的相关部分是:

如果不是开关块的非空块中的最后一条语句可以正常完成,则该块可以正常完成

如果以下至少一项为真,则basic for语句可以正常完成:

  • for语句是可访问的,存在一个条件表达式,条件表达式不是值为true的常量表达式(§15.28)
  • 有一个可到达的break语句退出for语句
如果for语句是可访问的,并且条件表达式不是值为false的常量表达式,则包含的语句是可访问的

内部循环实际上与行为无关:您将看到与以下行为完全相同的行为:

public String testFor() {
  // Compiler error if you uncomment the condition.
  for(int i = 0; /* i<10 */; i++) { 
  }
}
公共字符串testFor(){
//如果取消对条件的注释,编译器错误。

对于(inti=0;/*i来说,内部循环和
return
语句在这里并不重要

将编译以下代码段,但不存在
return
语句:

public String testFor() {
    for (int i = 0; ;i++) {
    }
}
该行为在Java语言规范()中指定:

如果方法被声明为具有返回类型 (), 然后,如果方法的主体可以 正常完成 ()


在这种情况下,由于无限循环,方法体无法正常完成,因此返回语句(或其他异常终止,例如
抛出SomeException()
)不是必需的。

在关闭方法之前,您必须在最后返回一些内容!您的期望是什么?您使用的是什么IDE/编译器?PS不要反对评论3,他正在返回一些内容。我认为您已经达到了编译器可以(允许)返回的极限推断您的块是否以返回结束。规则已经定义,但我还不能确定哪一位具体引用了您的案例。@Jorge.V eclipse IDEIt不是关于第二个循环。
for(int I=0;I<10;I++){return“success”;}
也不会编译。原因是循环条件在编译时没有被检查。@JaroslawPawlak理解。但是,如果我们删除该条件,为什么这不是一个错误。如果在编译时没有检查该条件,是否放置该条件又有什么关系。非void方法的规则是返回,必须返回一个值。在无限循环的情况下,没有返回路径,因此不需要返回值。您可以删除内部循环和return语句,只要有无限循环,它仍将编译。您应该将其作为答案添加。它应该被接受。@Abhishek,如其他答案中所述,若你们移除条件,它会变成一个无限循环,编译器会对此进行检查。参见Robby Cornelissen的答案
public String testFor() {
    for (int i = 0; ;i++) {
    }
}