【问题标题】:Methods that return boolean values返回布尔值的方法
【发布时间】:2012-11-03 16:00:16
【问题描述】:

好的,所以我的问题是关于布尔返回。对于我的 Comp Sci 作业,我必须使用方法制作课程注册程序,其中之一是添加课程方法。基本上,您在目录中搜索课程,如果匹配,则将其添加到学生日程表并返回布尔值 true。我这样做了,但由于某种原因,它给了我一个错误。代码如下:

public static boolean addCourse(
    Course[] catalog,
    Course[] mySchedule,
    int myNumCourses,
    int dept,
    int courseNum)
{
    int j;
    int i;
    int k;
    int deptCat;
    int courseNumCat;
    Course courseAdd = null;
    char checkDay;
    int checkTime;



    if (mySchedule.length == myNumCourses) {
        return false;
    }
        for (i = 0 ; i < catalog.length ; i++) {
            Course course = catalog[i];
            deptCat = course.getDepartment();
            courseNumCat = course.getCourseNumber();
            if (deptCat == dept && courseNumCat == courseNum) {
                courseAdd = catalog[i];
                break;
            }
            else continue; }
        for (j = 0 ; j < myNumCourses ; j++) {
            if (mySchedule[j] == null) {
                mySchedule[j] = courseAdd;
                return true;
                }
                else continue;
                }

    for (k = 0 ; k < mySchedule.length ; k++) {
        Course course = mySchedule[k];
        if (course != null) {
            checkDay = course.getDay();
            checkTime = course.getPeriod();
            if (checkDay == courseAdd.getDay() && checkTime == courseAdd.getPeriod()) {
                return false;
            }
        }
        else continue;

    }







}

为什么它不能识别布尔返回值?是不是因为我把它们放在了一个循环中?

【问题讨论】:

  • 错误是否类似于“并非所有代码路径都返回值”?
  • 除了缺少返回的 cmets 之外,我注意到您引用的代码没有根据其逻辑缩进。这可能是复制代码的产物。我确实建议使用可以格式化 Java 的编辑器,并定期重新格式化以使所有内容保持逻辑排列。

标签: java arrays methods boolean


【解决方案1】:

我认为最后一个循环有问题。如果返回 false 的条件从未满足,它会一直持续到调度结束,而不返回任何内容。如果您要在方法的末尾添加一个返回,则此循环可能会落入它。如果没有执行'return false',您的意思是在循环之后返回true吗?

    for (k = 0; k < mySchedule.length; k++) {
      Course course = mySchedule[k];
      if (course != null) {
        checkDay = course.getDay();
        checkTime = course.getPeriod();
        if (checkDay == courseAdd.getDay()
            && checkTime == courseAdd.getPeriod()) {
          return false;
        }
      } else
        continue;
    }

【讨论】:

  • 是的,这就是我的本意。
  • 那么你应该添加一个“return true;”最后,目标是在此之前检测到所有应该返回错误的案例。
【解决方案2】:

您必须在所有代码路径中显式返回布尔值(true/false)。因为您的函数的返回类型是“布尔值”。

在你的情况下,你必须在最后一个循环之后添加一个 return 语句。

如果不想写很多“return xx”语句,可以把这个函数的返回类型改为“void”,在错误的情况下抛出异常。

【讨论】:

    【解决方案3】:

    需要在方法的末尾放置一个return-statement,即使您可能知道它永远不会到达(编译器不够聪明,无法知道这一点,这就解释了错误)。

    例如,即使这样也不会编译:

    public static boolean foo() {
        if (true)
            return true;
    }
    

    除非我们添加最后的return 语句。你所拥有的是类似的。

    【讨论】:

    • 当我这样做时,它只是跳到最后并返回该值!
    • @PavelVaysberg 那么你的for-loops 一定有问题(即这不是将return 语句放在末尾的结果)。
    • @A.R.S.从我的评论中提取答案(摇头)
    • @evanmcdonnal 我希望你是在讽刺:P
    【解决方案4】:

    将返回值放在循环中并没有错,但是,编译器无法保证此方法会返回值,因此会引发错误。在方法的最后,您需要返回 true 或 false,以最合适的为准。您的所有返回都在条件范围内,因此可能无法执行,使您的函数没有返回语句。

    【讨论】:

    • 如果我在方法的最后添加一个 return true 或 false,该方法只是返回该值并跳过我所有的循环......也许它没有进入循环,我'会检查的。
    • @PavelVaysberg 这完全是另一个问题。检查该代码后,我可以向您保证,它不会因“并非所有代码路径都返回值”之类的错误而编译。在方法末尾添加 return 语句不会影响其前面代码的执行。
    • 那么我的问题是什么?我不明白为什么该方法不会执行我的 for 循环...
    • @PavelVaysberg 您的所有循环控制变量(即myCourses.Length)是否都大于0?您的代码不是很容易阅读,但如果您启动程序时有 0 个课程并且所有这些值都是 0,因此循环永远不会执行,我不会感到惊讶。此外,据我所知,else continue; 行没有任何作用。如果您的 if 条件未得到满足,并且您没有其他需要做的事情,则没有理由拥有 else
    【解决方案5】:

    无论您在哪里使用if 语句,它可能的else 也必须返回或流必须转到另一个返回。返回时缺少ELSE。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-10
      • 2012-11-04
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多