返回布尔值的方法

3

好的,我的问题是关于布尔返回值。我的计算机科学作业要求我使用方法创建一个课程注册程序,其中之一是添加课程方法。基本上,您在目录中搜索班级,如果匹配,则将其添加到学生的日程表中并返回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;

    }







}

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

错误是类似于“并非所有代码路径都返回值”吗? - evanmcdonnal
除了对缺少返回值的注释之外,我还注意到你引用的代码没有按照逻辑进行缩进。那可能是复制代码的结果。我建议使用一个可以格式化Java代码的编辑器,并定期重新格式化以保持逻辑上的对齐。 - Patricia Shanahan
5个回答

3

在你的方法末尾必须放置一个 return 语句,即使你知道它永远不会被执行 (编译器并不聪明,这就解释了错误的原因)。

例如,即使是这样也无法编译:

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

除非我们添加最后一个return语句,否则您所拥有的是类似的情况。

当我这样做时,它只是跳到结尾并返回该值! - biohax2015
@PavelVaysberg 那么你的 for 循环肯定有问题(也就是说,这不是将 return 语句放在最后导致的结果)。 - arshajii
@A.R.S.从我的评论中抄袭答案(摇头)。 - evanmcdonnal
@evanmcdonnal 我希望你是在开玩笑 :P - arshajii

2

我认为最后一个循环存在问题。如果未满足返回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;
    }

是的,那就是我想做的。 - biohax2015
然后你应该在末尾添加一个"return true;",并且在此之前,应该检测出每个应该返回false的情况。 - Patricia Shanahan

2

将返回值放在循环中并没有问题,但编译器看不到该方法一定会返回一个值,因此会出现错误。在方法的最后,您需要返回true或false,具体取决于情况。所有的返回值都处于条件语句中,可能无法执行,导致函数没有返回语句。


如果我在方法的最后添加一个返回true或false的语句,该方法将仅返回该值并跳过所有循环...也许它没有进入循环,我会检查一下。 - biohax2015
@PavelVaysberg 嗯,那是另一个问题了。经过检查代码后,我可以保证它不会编译通过,会出现“并非所有的代码路径都返回值”的错误。在方法末尾添加一个返回语句对于其前面的代码执行没有任何影响。 - evanmcdonnal
那我的问题是什么?我不明白为什么这个方法不执行我的for循环... - biohax2015
@PavelVaysberg 你所有的循环控制变量(例如myCourses.Length)都大于0吗?你的代码不是很容易阅读,但如果在程序开始时你没有课程并且所有这些值都为0,那么循环将永远不会执行,这一点我并不感到惊讶。此外,据我所知,所有的 else continue; 行都没有任何作用。如果你的 if 条件未被满足,并且没有其他需要完成的任务,那么就没有理由使用 else - evanmcdonnal

2

在所有的代码路径中,你必须明确地返回一个布尔值(true/false),因为你的函数的返回类型是“boolean”。

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

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


1

无论您在何处使用if语句,都有可能需要else并返回或流转到另一个返回。缺少ELSE与返回。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接