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++) {
}
}