【问题标题】:Java boolean method with if statement - " must return a result of type boolean" [duplicate]带有if语句的Java布尔方法-“必须返回布尔类型的结果”[重复]
【发布时间】:2015-09-01 17:05:12
【问题描述】:

我在使用布尔方法时遇到了问题。

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;
}

我想我已经在语句中包含了return,除了它们在if 语句之后。

【问题讨论】:

  • 请稍微格式化一下代码。

标签: java boolean


【解决方案1】:

谢谢大家。似乎“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);
    }

【讨论】:

    【解决方案2】:

    你需要在 for 循环之后返回一个布尔值。如果假设 n = -1,则不会执行“if”语句。

    【讨论】:

      【解决方案3】:

      如果一个方法被声明为返回一些东西,那么所有的代码路径都必须返回一个值。您有两个返回值的代码路径,一个不返回值的代码路径。格式化你的代码,问题就更清楚了:

      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;
      }
      

      这可以进一步简化。作为消除错误的第一步,代码格式化非常重要。重新格式化你的第二个例子,看看你是否能弄清楚什么是必需的,什么不是。

      【讨论】:

        【解决方案4】:

        在 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]
        }
        

        【讨论】:

          【解决方案5】:

          首先,尝试格式化您的代码,以便更容易遵循逻辑。在第一个代码中,您收到错误的原因是该方法可能不返回任何内容。如果 prompt 不是 yes 且不是 no,它将转到 else 语句。程序将运行 readLine,并退出该方法而不返回任何内容。你想要做的是在一个while循环中运行readline,直到输入yes或no才会终止。

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

          【讨论】:

            【解决方案6】:

            每个执行路径都必须返回一个布尔值。在您的第一个示例中,else prompt = readLine("Please answer yes or no."); 不返回布尔值

            【讨论】:

              【解决方案7】:

              您需要在方法本身的范围内返回某些内容(true 或 false),因为您的 return 语句目前在 if 语句之外是不“可见的”。

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

              【讨论】:

                【解决方案8】:

                虽然您确实包含了一对 return 语句,但它们都发生在循环内。 Java 检查所有路径,发现循环可以在不进入第一次迭代的情况下完成——例如,因为n 是否定的。在这种情况下,if 语句不会被执行,因此不会有return

                您可以在循环之后包含一个无条件返回来解决此问题。但是,您的逻辑似乎被打破了:如果您完全进入循环,您将立即返回,而不会完成第一次迭代。看起来你打算写这个:

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

                【讨论】:

                  猜你喜欢
                  • 2013-11-24
                  • 2016-11-08
                  • 2020-08-08
                  • 2013-10-01
                  • 1970-01-01
                  • 2015-05-03
                  • 2011-04-28
                  • 2022-11-11
                  • 1970-01-01
                  相关资源
                  最近更新 更多