布尔方法在调用时返回Null

时间:2019-12-06 02:02:50

标签: nullpointerexception return boolean abstract-class

我正在为Uni的项目创建JavaTraining学校模拟器。为此,我正在研究一种模拟单个上学日的方法。此方法的要求是将讲师设置为免费课程。每位讲师只能教一门课程。因此,对于每门课程,我都会遍历所有讲师,直到找到免费的。如果该教师也具有正确的证书来教授该课程,则将其设置为课程教师。当试图限制只教一门课程的讲师时,我总是遇到一个奇怪的问题。

我尝试通过以下方式实现它:

public void aDayAtSchool() {
    courses.forEach((thisCourse) -> {
        if(!thisCourse.hasInstructor()){
            for(Instructor thisInstructor: instructors){
                if(thisInstructor.isFree() && thisInstructor.canTeach(thisCourse.getSubject())){
                    thisInstructor.assignCourse(thisCourse);
                    thisCourse.setInstructor(thisInstructor);
                    break;
                }
            }
        }
    });
}

讲师保存在ArrayList中。 Instructor类本身是一个抽象类,主要包含具体方法。教师的子类是教师和演示者。

讲师类(代码真是一团糟,因为我一直在摆弄它以解决我的问题):

公共抽象类讲师扩展Person {

private Course assignedCourse;
private boolean isFree;

public Instructor(String Name, char Gender, int Age) {
    super(Name, Gender, Age);
    this.isFree = true;
}

public void assignCourse(Course thisCourse) {
    this.assignedCourse = thisCourse;
    this.isFree = false;
}

public void unassignCourse() {
    this.assignedCourse = null;
    this.isFree = true;
}

public Course getAssignedCourse() {
    return assignedCourse;
}

public abstract boolean canTeach(Subject thisSubject);

public boolean isFree(){
    return isFree;
}

}

演示程序类:

公共类演示程序扩展了教师{

public Demonstrator(String Name, char Gender, int Age) {
    super(Name, Gender, Age);
}

@Override
public boolean canTeach(Subject thisSubject) {
    return (thisSubject.getSpecialism() == 2);
}

}

教师班级与示教班级的模板完全相同。

我正在测试以下代码:

public static void main(String args[]) {
    School dormers = new School("Dormers");
    Subject basics = new Subject(1, 1, 5);
    Subject Lab1 = new Subject(2, 2, 2);
    Student Peter = new Student("Peter", 'M', 60);
    Student Anabelle = new Student("Anabelle", 'F', 23);
    Course course1 = new Course(basics, 1);
    basics.setDescription("basics");
    Lab1.setDescription("Lab1");
    Course course2 = new Course(Lab1, 2);
    Teacher tom = new Teacher("Tom", 'M', 20);
    Demonstrator jerry = new Demonstrator("Jerry", 'F', 23);
    dormers.add(course2);
    dormers.add(course1);
    dormers.add(tom);
    dormers.add(jerry);
    dormers.add(basics);
    dormers.add(Peter);
    dormers.add(Anabelle);
    dormers.add(Lab1);
    dormers.aDayAtSchool();
    System.out.println(course1.hasInstructor());        
}

最初,没有将教员添加到课程1。我事先对此进行了测试,以确保hasInstructor函数可以正常运行。它应该在dormers.aDayAtSchool()之后输出true。叫做。但是它总是打印为假。

我能找到的代码的唯一问题是thisInstructor.isFree()条件。奇怪的是,尝试以模仿此功能的任何方式编写此代码都会产生相同的问题。香港专业教育学院尝试了许多不同的方式来创建此布尔值,但每次出现相同的问题时。如果我摆脱了这种情况,仅使用canTeach方法,则该程序的其余部分将正常运行,并且True会按需打印到控制台。但是,如果我将其保留在if语句中,则代码会崩溃。测试时,我将条件修改为:

            if(!thisInstructor.isFree() && thisInstructor.canTeach(thisCourse.getSubject())){

但是输出仍然为假。这很奇怪,因为我已经测试了canTeach函数,并知道这些输入将返回true。这意味着isFree布尔值必须为null,否则将无法保持输出为假。

在一个非常简单的项目中,我花了4个小时大部分时间都在努力解决这个问题。任何帮助将不胜感激。

0 个答案:

没有答案