Do-while 语句 Java
Posted
技术标签:
【中文标题】Do-while 语句 Java【英文标题】:Do-while statement Java 【发布时间】:2016-01-10 12:19:10 【问题描述】:我是编程新手。我很难理解这段代码:
public static boolean onCampus(String name)
boolean invalidResponse = true;
do
System.out.println("Is "+name+ " living on campus? (yes/no)");
String response = in.nextLine();
if(response.equalsIgnoreCase("yes"))
return true;
else if (response.equalsIgnoreCase("no"))
return false;
else
System.out.println("Invalid response.");
while(invalidResponse);
return false;
如果用户输入可接受的响应,我不知道invalidResponse
在哪里分配false
?最后一个return false;
是什么?为什么在do-while语句之后?
【问题讨论】:
最后一个return false;
是无法访问的代码。编译器不知道 invalidResponse
永远不会更新,但如果您将其更改为 do ... while (true);
您会从最后一个 return 语句中得到一个编译错误。
【参考方案1】:
假设in
代表一个静态的Scanner
变量。
循环是故意无限的; invalidResponse
永远不会被设置为 false
。
相反,return
行是退出循环的方法,假设输入了 "yes"
或 "no"
的值。
最终的return false;
是编译所必需的,但永远不会到达。
然而,值得注意的是,我是单个 return
的粉丝,它使用常量作为等号的前半部分,并删除了一次区分大小写,并将其重新编码为:
public static boolean onCampus(String name)
boolean response = false;
do
System.out.println("Is " + name + " living on campus? (yes/no)");
String input = in.nextLine().toLowerCase();
response = "yes".equals(input);
if (response || "no".equals(input))
break; // exit the loop
else
System.out.println("Invalid response.");
while (!response);
return response;
【讨论】:
【参考方案2】:最后一个“return false;”就在那里,这样编译器就不会抱怨,它是无法访问的代码。因为您的返回类型是布尔值,所以您的代码在所有情况下都必须返回 true 或 false。 "invalidResponse" 永远不会分配给 false,因此您的循环将无限运行,直到用户输入是或否,在这种情况下它返回布尔值并退出函数。
【讨论】:
【参考方案3】:这在某种程度上是一种反模式 - 循环是无限的,并且永远不会“正确”终止。相反,一旦获得有效响应,您只需调用 return
并退出该方法,从而终止循环。
循环后的return false
是一个编译限制。在 java 中,如果方法返回一个值,那么每个可能的分支都必须包含一个 return
语句(或者准确地说是一个 throw
语句)。在编译时,Java 并不“知道”循环可能永远不会终止,因此它会强制您在该分支中有一个 return 语句(即,假设循环在没有执行 if
或 else if
分支的情况下终止)。
【讨论】:
谢谢。这是编写此方法的最佳方式还是使用其他循环语句更合适? @MarcoGreselin 这是一个很常见的成语。我会内联invalidResponse
变量,但这比什么都重要。以上是关于Do-while 语句 Java的主要内容,如果未能解决你的问题,请参考以下文章
Java利用do-while循环语句计算1!+2!+3!…n!