循环不终止,布尔值更改

时间:2015-06-27 12:51:41

标签: java

一个工作示例是使用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条件终止。

2 个答案:

答案 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