带有if语句的Java布尔方法-“;必须返回布尔类型的结果";

带有if语句的Java布尔方法-“;必须返回布尔类型的结果";,java,boolean,Java,Boolean,我在布尔方法方面遇到了麻烦 private boolean askYesNoQuestion(String prompt){ prompt = prompt.toLowerCase(); if(prompt.equals("yes")) return true; if(prompt.equals("no")) return false; else prompt = readLine("Please answer yes or no."); } Eclipse说:“方法必须返回布尔类型的结果”

我在布尔方法方面遇到了麻烦

private boolean askYesNoQuestion(String prompt){
prompt = prompt.toLowerCase();
if(prompt.equals("yes")) return true;
if(prompt.equals("no")) return false;
else prompt = readLine("Please answer yes or no.");
}
Eclipse说:“方法必须返回布尔类型的结果”

以下代码中存在相同的问题:

private boolean isPerfectSquare(int n){
for(int i = 0; i <= n; i++){
if(i*i == n) {
return true;
}
else return false;
}
private boolean isPerfectSquare(int n){

对于(int i=0;i虽然包含一对返回语句,但它们都发生在循环内部。Java检查所有路径,发现循环可以在不进入第一次迭代的情况下完成-例如,因为
n
是负数。在这种情况下,
if
语句将不执行,因此ld为no
返回

您可以在循环后包含一个无条件返回来修复此问题。但是,看起来您的逻辑被破坏了:如果您完全进入了循环,您将立即返回,而不会完成第一次迭代。看起来您打算编写以下内容:

private boolean isPerfectSquare(int n){
    for(int i = 0; i <= n; i++){
        if(i*i == n) {
            return true;
        }
    }
    return false;
}
private boolean isPerfectSquare(int n){

对于(int i=0;i,您需要在方法本身的范围内返回一些东西(true或false),因为您的返回语句当前在if语句之外不“可见”


实际上,您可以在第二个方法中省略else语句。对于第一个方法,只需在最后一个else之外返回false即可。

每个执行路径都必须返回布尔值。在第一个示例中,
else prompt=readLine(“请回答是或否”);
不返回布尔值

您需要在for循环后返回布尔值。如果n=-1,则不会执行'if'语句。

首先,尝试格式化代码,以便更容易遵循逻辑。在第一个代码中,出现错误的原因是该方法可能不返回任何值ing。如果提示符不是“是”且不是“否”,它将转到else语句。程序将运行readLine,并在不返回任何内容的情况下退出该方法。您要做的是在while循环中运行readLine,该循环在输入“是”或“否”之前不会终止


对于第二个问题,您有一个逻辑问题。如果n不是0,您的方法将始终返回false。您应该将返回false行移到For循环之外。

在else语句的第一个块中,您没有返回任何内容。 这个改变会使它好起来的

private boolean askYesNoQuestion(String prompt){
     prompt = prompt.toLowerCase();
     if(prompt.equals("yes")) 
          return true;
     if(prompt.equals("no")) 
          return false;
     else {
          prompt = readLine("Please answer yes or no.");
          return [true or false]
      }
}
在第二个块中,若n是负值,那个么for语句将不会运行,所以其中并没有return语句。 这样就可以了

private boolean isPerfectSquare(int n){
    for(int i = 0; i <= n; i++){
        if(i*i == n) {
            return true;
        }
        else 
            return false;
    }
    return [true or false]
}
private boolean isPerfectSquare(int n){

对于(int i=0;i如果一个方法被声明为返回某个值,则所有代码路径都必须返回一个值。您有两个代码路径确实返回值,一个不返回值。格式化代码后,问题就更清楚了:

private boolean askYesNoQuestion(String prompt) {
    prompt = prompt.toLowerCase();
    if (prompt.equals("yes")) {
        return true;
    }

    if (prompt.equals("no")) {
        return false;
    } else {
        prompt = readLine("Please answer yes or no.");
    }

    // You must return a boolean value here
}
最后的
else
语句是多余的-如果
prompt
等于
no
,则不会执行进一步的代码。您可以将其删除,然后在适当的位置添加另一个
return false

private boolean askYesNoQuestion(String prompt) {
    prompt = prompt.toLowerCase();
    if (prompt.equals("yes")) {
        return true;
    }

    if (prompt.equals("no")) {
        return false;
    }

    writeLine("Please answer yes or no.");
    return false;
}

这可以进一步简化。作为消除bug的第一步,代码格式可能非常重要。重新格式化第二个示例,看看是否可以找出需要什么和不需要什么。

感谢大家。似乎“return”语句必须位于任何循环之外(例如for或while)。以下代码产生了良好的结果

public class Test1 extends ConsoleProgram {

public void run() { 
    String prompt = readLine("Would you like instructions?");
    prompt = prompt.toLowerCase();
    while(!prompt.equals("yes") && !prompt.equals("no")){
        prompt = readLine("Please answer yes or no.");  
        prompt = prompt.toLowerCase();
    }   
    if(askYesNoQuestion(prompt)) println("Here are the instructions.");
    else println("Please start the test.");
    println(askYesNoQuestion(prompt));

}
private boolean askYesNoQuestion(String prompt){        
    if(prompt.equals("yes")) {
        return true;
    }
    else return false;              
}
}

如果“return”语句在循环之外,第二个程序也可以工作:

private boolean isPerfectSquare(int n){
        int i = 0;
        while (i*i != n ) {
                if (i*i > n) break; 
                i ++;
        }
        return (i*i == n);
    }

请把代码格式化一点。