0

为此,我正在运行 BlueJ 做面向对象的 java 并且我有 JVM 7.1 处于活动状态......

好的,所以我必须申请我的学位,但我遇到了麻烦。我很感谢“老师”让我使用我的三阵列系统,因为迭代器弄乱了我的单阵列系统。

遗憾的是,我无法在互联网上找到任何可以帮助解决我的问题的东西......

基本上当我去向数组添加一个“学生”时,该对象在所有字段中都是空的。我不知道如何修改它们。

我的数组使用菱形符号。类似于以下内容:

private ArrayList<Student> students;

这是我目前使用的数组形式,还有 2 个数组。

private ArrayList<CollegeEmployee> staff;
private ArrayList<Faculty> members;

有人建议我使用单个数组,但如上所述,迭代器把它搞砸了,只要我能修复它,我不在乎我有多少个数组,哈哈。

该程序在一个 while 循环内运行,并提示用户为某个命令输入一个字母。当用户输入“s”时,然后将一个学生添加到数组中,这就是问题所在。对象被赋予空值,我不知道如何修改它们...以下是调用对象构造函数

private void addStudent()
{
    Student b = new Student(firstName, lastName, address, postCode, phoneNumber, gradePointAvg, selectedCourse);
students.add(b);
}

当用户退出程序时打印数组时,我从终端窗口得到以下输入:

空,空,空,0,0 0 空

我的问题是:我如何给对象 b 值以覆盖空值。顺便说一句,这些值必须由用户输入,而不是在数组的声明中预先设置。

感谢您的时间 :)

这东西让我讨厌代码 xD

编辑:

这是学生类的构造函数和字段:

    private String title;
        public double gradePointAvg;
        public String selectedCourse;

        /**
         * Constructor for objects of class Student
         */
        public Student(String firstName, String lastName, String address, int postCode, int phoneNumber, double gradePointAvg, String selectedCourse)
        {
            super(firstName, lastName, address, postCode, phoneNumber);
            this.title = title;
            this.gradePointAvg = gradePointAvg;
            this.selectedCourse = selectedCourse;
        }

人超类构造函数:

public String firstName;
public String lastName;
public String address;
public int postCode;
public int phoneNumber;

 /**
 * Constructor for objects of class Person
 */
public Person(String firstName, String lastName, String address, int postCode, int phoneNumber)
{
    // initialise fields
    this.firstName = firstName;
    this.lastName = lastName;
    this.address = address;
    this.postCode = postCode;
    this.phoneNumber = phoneNumber;
}

上面的方法,addStudent 调用 student 构造函数,然后调用 person 构造函数。是的,它确实必须像这样,因为它是项目的限制。

我暂时公开了我的字段,因为它们被设置为受保护,因为私有是本地范围。

非常感谢你们检查我的代码..我希望我的老师更好>.<

4

3 回答 3

0

你初始化你的ArrayList了吗?

 private ArrayList<Student> students;
 students = new ArrayList<Student>();

别的

private ArrayList<Student> students = new ArrayList<Student>();

如果未初始化,它将返回空值,您将获得空指针异常。

于 2012-05-23T04:11:13.483 回答
0

在您的 Student 类firstName, lastName, address,selectedCourseString,Java 将初始化实例变量,这些实例变量是 Objects(在您的情况下为 String)null,对于您的其他字段,即postCode, phoneNumber我认为int默认值为 0。

当您在addStudent方法中检查用于构造对象的值时,似乎所有字符串都是 null 并且 int 未初始化。

Student b = new Student(firstName, lastName, address, postCode, phoneNumber, gradePointAvg, selectedCourse);

执行上面的代码时,我认为 firstName、lastName 等参数都没有任何值,这就是它显示 null 的原因。

在将新Student对象添加到列表之前students,提示您的用户为firstName, lastName, addressetc 提供值,然后使用这些值来构造您的Student对象。

更新示例代码:

学生班级:

package com.mumz.test.scanner;

public class Student {
    private String firstName = null;
    private String lastName = null;
    /**
     * @param firstName
     * @param lastName
     */
    public Student(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    /**
     * @return the firstName
     */
    public String getFirstName() {
        return firstName;
    }
    /**
     * @param firstName the firstName to set
     */
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    /**
     * @return the lastName
     */
    public String getLastName() {
        return lastName;
    }
    /**
     * @param lastName the lastName to set
     */
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return String.format("Student [firstName=%s, lastName=%s]", firstName, lastName);
    }
}

主要班

package com.mumz.test.scanner;

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

public class StudentScannerApp {
    private List<Student> students = new ArrayList<Student>();
    public static void main(String[] args) {

        StudentScannerApp studentScannerApp = new StudentScannerApp();
        //This scanner we will use for reading data from input stream
        Scanner inputStream = new Scanner(System.in);

        System.out.println("Enter First Name");
        String firstName = inputStream.nextLine();
        System.out.println("Enter Last Name");
        String lastName = inputStream.nextLine();
        studentScannerApp.addStudent(firstName, lastName);

        System.out.println("Enter Another student details");
        System.out.println("Enter First Name");
        firstName = inputStream.nextLine();
        System.out.println("Enter Last Name");
        lastName = inputStream.nextLine();
        studentScannerApp.addStudent(firstName, lastName);

        System.out.println(studentScannerApp.students);
    }

    private void addStudent(String firstName, String lastName){
        Student student = new Student(firstName, lastName);
        students.add(student);
    }
}
于 2012-05-23T04:12:53.700 回答
0

我想学生扩展人,不是吗?

那么你的构造函数应该是这样的

public Student(String firstName, String lastName, String address, int postCode, int phoneNumber){
    super(firstName, lastName, address, postCode, phoneNumber);
    //Do whatever stuff Students do and normal Persons do not do.
}

并且您的 addStudent 方法应该以这种方式添加学生:

private void addStudent(Student student){
    students.add(student);
}

(无论如何,将其设为私有并没有多大意义,但我想您仍在学习)

所以,当你想创建和添加一个新学生时,你只需这样做(当然,你可以这样做,但如果你不想在你的数组中有大量名为 John Smith 的学生,你真的应该使用变量)

Student student = new Student("John", "Smith", "Fake Street", 123, 12345, 5555555);
students.add(student);
于 2012-05-23T09:39:01.150 回答