一个工作示例是使用while循环继续从用户获取数字,直到他们正确猜出数字,然后它将返回true并退出while循环。
但是,如果我创建一个返回变量是true还是false的方法,则while循环不会终止。但是,如果IF条件在while循环内部,它将终止并按预期工作。
符合预期的代码:
private void print() { // Method name not decided yet
boolean playerGuessedCorrectly = false;
while(!playerGuessedCorrectly) {
[...] // Other code that asks the user to enter a new number
// userGuess is the next int entered by the user
// computerNumber is a random number between 1 and 100
if(userGuess == computerNumber) {
System.out.print("You have guessed my number.");
playerGuessedCorrectly = true;
} // while loop terminates upon true
}
}
此代码有效,while循环在更改为true时停止工作。但是,当我在方法中放入相同的代码时,while循环继续循环并且不会终止:
不工作代码:
private void print() {
boolean playerGuessedCorrectly = false;
while(!playerGuessedCorrectly) {
checkIfGuessIsMyNumber(playerGuessedCorrectly);
} // value of playerGuessedCorrectly is sent to method checkIfGuessIsMyNumber();
private boolean checkIfGuessIsMyNumber(boolean playerGuessedCorrectly) {
// userGuess is the next int entered by the user
// computerNumber is a random number between 1 and 100
if(userGuess == computerNumber) {
System.out.print("You have guessed my number.");
return playerGuessedCorrectly = true;
} else {
playerGuessedCorrectly = false;
}
}
为了澄清,当if userGuess == computerNumber在while循环中时,while循环终止,但是,当它被拆分为不同的方法并返回值时,它不起作用。
请注意,当我打印出方法给出的值时,它打印为true。所以我很困惑为什么它不会在方法中的值为真时终止,但它会在while循环中以if条件终止。
答案 0 :(得分:5)
这一行:
playerGuessedCorrectly = false;
和这一行:
return playerGuessedCorrectly = true;
不起作用,因为Java按值传递参数。您实际上是将false
分配给playerGuessedCorrectly
功能本地的checkIfGuessIsMyNumber
副本,而不是分配给print
中的原始版本功能
逐行跟踪无效代码:
boolean playerGuessedCorrectly = false;
这可以按预期工作。
while(!playerGuessedCorrectly) {
// ...
}
如果playerGuessedCorrectly
的值已正确更新,这将按预期工作。
checkIfGuessIsMyNumber(playerGuessedCorrectly);
这是你出错的地方。这会将当前存在的playerGuessedCorrectly
变量的值复制到checkIfGuessIsMyNumber
函数的参数中。在该函数中,playerGuessedCorrectly
的新副本被重新分配了不同的值,并且您有一个return语句,但请注意,您实际上从未使用该函数的返回值。如果你做了类似的事情:
playerGuessedCorrectly = checkIfGuessIsMyNumber(playerGuessedCorrectly);
您的代码可以按预期工作。您可能还想清理checkIfGuessIsMyNumber
函数的正文:
if(userGuess == computerNumber) {
System.out.print("You have guessed my number.");
return true;
} else {
return false;
}
答案 1 :(得分:1)
Java中的参数按值传递。因此,当您调用printf("numero");
时,您只需覆盖playerGuessedCorrectly = false
参数的本地副本。
将逻辑包含在函数中的另一种方法是让它返回适当的值:
playerGuessedCorrectly