【问题标题】:When I print out my list it prints out null for all my values..... How do I fix this issue???? I want to learn how to fix this issue for future当我打印出我的列表时,它会为我的所有值打印出 null .....我该如何解决这个问题????我想学习如何解决这个问题以备不时之需
【发布时间】:2021-12-24 07:19:48
【问题描述】:

我为我的老师制作了一份清单并打印出来。列表打印,但问题是我的列表为列表中的所有值打印出 null。它给我的名字、姓氏、身份证和课程为空。我究竟做错了什么???我怎样才能解决这个问题?我希望能够在我的教师列表中打印出我的实际值。如果我完全诚实,我看不出有什么问题。我将名字、姓氏、身份证和课程正确添加到教师列表中。那我错过了什么????

错误:

Main.java 代码:

package SchoolSystem;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;

public class main{
    public static void main(String[] args) throws InterruptedException {

        int ch; //user choice
        teacher teachers = new teacher();
        student students = new student();
        //add teachers
        List<teacher> teach = new ArrayList<>();
        teach.add(new teacher(teachers.first_name, teachers.last_name, teachers.teacher_id, teachers.course));
        Scanner sc = new Scanner(System.in);

        loop : while (true) {
            //menu
            System.out.println("");
            System.out.println("1: Add Teacher"); //user can add a teachers name, id, and course
            System.out.println("2: Add Student"); //user can add a students name, id, courses, and GPA
            System.out.println("3: All Teachers"); //user can access teacher list and change items
            System.out.println("4: All students"); //user can access student list and change items
            System.out.println("5: Exit Program");
            System.out.print("Enter your choice: ");
            ch = sc.nextInt();
            System.out.println("");
            switch (ch) {
                case 1:
                    System.out.println("Enter teacher's first name: ");
                    teachers.first_name = sc.next();
                    System.out.println("Enter teacher's last name: ");
                    teachers.last_name = sc.next();
                    System.out.println("Enter teacher's id: ");
                    teachers.teacher_id = sc.next();
                    System.out.println("Enter teacher's course: ");
                    teachers.course = sc.next();
                    break;

                case 2:
                    System.out.println("Enter student's first name: ");
                    students.first_name = sc.next();
                    System.out.println("Enter student's last name: ");
                    students.last_name = sc.next();
                    System.out.println("Enter student's id: ");
                    students.student_id = sc.next();
                    System.out.println("Enter student's course: ");
                    students.course = sc.next();
                    break;

                case 3:
                    System.out.println("-----------------------------------------------------------------------------");
                    System.out.printf("%1s %20s %5s %5s", "FIRSTNAME", "LASTNAME", "ID", "COURSE");
                    System.out.println();
                    System.out.println("-----------------------------------------------------------------------------");
                    for(teacher teacher: teach){
                        System.out.format("%1s %20s %5s %5s",
                                teacher.getFirstName(), teacher.getLastName(), teacher.getId(), teacher.getCourse());
                        System.out.println();
                    }
                    System.out.println("-----------------------------------------------------------------------------");
                    break;

                case 4:
                    //null
                    break;

                case 5:
                    /*
                    System.out.println("Exiting Program....");
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println("Goodbye!");
                    break loop;
                     */
                    break;

                default:
                    //System.out.println("Invalid choice! Please enter an option (1 - 5)");
            }
        }
    }
}

Teacher.java 代码:

package SchoolSystem;

public class teacher {
    public teacher() {
        //null
    }

    public String first_name;
    public String last_name;
    public String teacher_id;
    public String course;

    public teacher(String first_name, String last_name, String teacher_id, String course) {
        this.first_name = first_name;
        this.last_name = last_name;
        this.teacher_id = teacher_id;
        this.course = course;
    }

    //return firstname
    public String getFirstName() {
        return first_name;
    }

    //return lastname
    public String getLastName() {
        return last_name;
    }

    //return teacherId
    public String getId() {
        return teacher_id;
    }

    //return course
    public String getCourse() {
        return course;
    }
}

【问题讨论】:

  • 您要做的第一件事是使用未初始化的“教师”添加教师。稍后您更新该教师的单个实例;您的下一个问题将是列表中的所有教师都有相同的数据。
  • 它应该来自列表“teach”
  • 我该如何解决这个问题?抱歉,我是 Java 新手...我将不胜感激 :)

标签: java list class


【解决方案1】:

在教师课堂中,您必须添加设置器

公开课老师{

public Teacher() {
    //null
}

public String first_name;
public String last_name;
public String teacher_id;
public String course;

public Teacher(String first_name, String last_name, String teacher_id, String course) {
    this.first_name = first_name;
    this.last_name = last_name;
    this.teacher_id = teacher_id;
    this.course = course;
}

//return firstname
public String getFirstName() {
    return first_name;
}

public void setFirstName(String firstName) {
   this.first_name = firstName;
}

//return lastname
public String getLastName() {
    return last_name;
}

public void setLastName(String lastName) {
    this.last_name = lastName;
 }

//return teacherId
public String getId() {
    return teacher_id;
}

public void setId(String id) {
    this.teacher_id = id;
 }

//return course
public String getCourse() {
    return course;
}

public void setCourse(String course) {
    this.course = course;
 }

}

在主要 删除这一行

teach.add(new Teacher(teachers.getFirstName(), teacher.getLastName(), teacher.getId(), teacher.getCourse()));

然后写:

int ch; //user choice
        
        //add teachers
        List<Teacher> teach = new ArrayList<>();
        Scanner sc = new Scanner(System.in);

        //          teach.add(new Teacher(teachers.getFirstName(), teacher.getLastName(), teacher.getId(), teacher.getCourse()));

        loop : while (true) {
            //menu
            System.out.println("");
            System.out.println("1: Add Teacher"); //user can add a teachers name, id, and course
            System.out.println("2: Add Student"); //user can add a students name, id, courses, and GPA
            System.out.println("3: All Teachers"); //user can access teacher list and change items
            System.out.println("4: All students"); //user can access student list and change items
            System.out.println("5: Exit Program");
            System.out.print("Enter your choice: ");
            ch = sc.nextInt();
            System.out.println("");
            switch (ch) {
                case 1:
                    Teacher teachers = new Teacher();
                    System.out.println("Enter teacher's first name: ");
                    teachers.setFirstName(sc.next());
                    System.out.println("Enter teacher's last name: ");
                    teachers.setLastName(sc.next());
                    System.out.println("Enter teacher's id: ");
                    teachers.setId(sc.next() );
                    System.out.println("Enter teacher's course: ");
                    teachers.setCourse (sc.next());

                    teach.add(teachers);
                    
                    break;

                case 2:
                // .....

使用setter添加值并将“教师”对象添加到列表中

teach.add(teachers);

【讨论】:

  • 抱歉,但这会将相同的“教师”对象添加到列表中,这是行不通的。如果 OP 设法让它工作,每次更新“教师”变量时,所有对象都将具有相同的数据。如果我没有在这里解释清楚,请参阅我的答案。
  • @computercarguy 我只是想更正这条指令“teach.add(new Teacher(teachers.getFirstName(),teacher.getLastName(),teacher.getId(),teacher.getCourse())) ;"因为写指令的顺序是错误的,我很清楚应该写成 Teacher Teachers = new Teacher();教.add(教师);
  • Teacher teachers = new Teacher(); 应该在循环中。由于它仍在循环之外,它只是一个实例,将被每个新教师的数据覆盖。按照您修改它的方式,尝试将对象添加到它已经是其成员的列表时可能会出现运行时错误。
  • 我很理解你,这只是一个小错误,我正专注于向他解释二传手,谢谢,
  • Setter 和 Getter 并不是必需的。真正的问题是变量的位置,它是如何添加到列表中的,以及它是在哪里添加的。我很高兴你修正了你的答案。如您所知,即使一行错位的代码不合适仍然会导致 OP 问题。
【解决方案2】:

您的代码存在 OOP 问题。

teacher teachers = new teacher();
...
List<teacher> teach = new ArrayList<>();
teach.add(new teacher(teachers.first_name, teachers.last_name, teachers.teacher_id, teachers.course));

这个 sn-p 获取 teacher 的一个新实例,然后创建一个全新的 teacher 实例以添加到列表中。 这是 2 个不同的对象。 我假设您来自 C 或 C++,并且您将它们视为指针?幸运的是,Java 不是这样工作的。

您可以简单地将“teachers”变量添加到“teach”列表中。然后当您稍后更新“teachers”对象时,数据将在“teach”列表中可用。

需要注意的是,您需要在循环内为“教师”实例化一个新对象,并将修改后的 teach.add(teachers); 移动到循环中。

List<teacher> teach = new ArrayList<>();
List<student> stud = new ArrayList<>();
Scanner sc = new Scanner(System.in);

loop : while (true) {
    ...
    switch (ch) {
        case 1:
            teacher teachers = new teacher();
            ...
            teach.add(teachers);
            break;
        case 2:
            student students = new student();
            ...
            stud.Add(students);
            break;
        ...

现在您有一个新的teacher 对象,每个教师以及一个仅包含有效数据而不是空对象的列表。

这是可行的,因为“teach”现在包含对“teachers”实例的引用。这类似于我前面提到的 C 和 C++ 的指针。在这种情况下,您拥有对整个对象的引用,而不是您之前尝试拥有的对象的各个属性。

把一个对象想象成一张纸,把一个列表想象成一个盒子。你可以把各种数据放在纸上,然后把纸放进盒子里。当您需要一个新对象时,您会得到一张新纸,在上面写下数据,然后将其添加到盒子中。然后当你想更新一个对象时,你在框中找到它并更新数据。就是这么简单。您可以拥有一个复杂的对象,其中包含其他对象的实例,但这超出了您的问题范围。

附注

teacherstudent 类应大写为 TeacherStudentTeachers 的列表应命名为“teacher”,单个 Teacher 对象应命名为“teacher”,或者不会与类名混淆的名称。一般来说,列表应该是复数,单数应该是单数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-25
    • 2020-02-14
    • 2021-07-31
    • 2020-12-28
    • 2019-12-03
    相关资源
    最近更新 更多