【问题标题】:Calling a method to create an array in another class调用方法在另一个类中创建数组
【发布时间】:2014-12-05 01:35:58
【问题描述】:

学生演示:

public class studentDemo {
    public static void main(String[] args) throws IOException{
        int runit = 0;

        StudentMenu run = new StudentMenu();
        while (runit != 1) {
            run.menu();
        }
    }
}

学生菜单:

public class StudentMenu {

    public Student func = new Student();
    List<Student> studentList = new ArrayList<Student>();

    String input;
    String input2;
    String input3;

    public void menu(){
        System.out.println("Choose an option: ");
        System.out.println("1) Add a student ");
        System.out.println("2) Display student list ");
        System.out.println("3) Exit ");

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        try {

            input = br.readLine();
            int choice = Integer.parseInt(input);
            System.out.println("Choice: " + choice);

            if(choice == 1){
                System.out.println("First name: ");
                input = br.readLine();
                System.out.println("Last name: ");
                input2 = br.readLine();
                System.out.println("Number of classes to add for student: ");
                input3 = br.readLine();
                int numberOfClasses = Integer.parseInt(input3);

                studentList.add(new Student(input, input2, numberOfClasses));

                func.createClassList(numberOfClasses);
            }

            if(choice == 2){
            }

            if(choice == 3){
                System.exit(0);
            }       
        }
        catch (IOException ioe){ 
            System.out.println("An unexpected error occured.");
        }
    }
}

学生:

public class Student{   

    private String firstName;
    private String lastName;
    private int classes;
    //Create array for classes
    private String[] classesList = new String[classes];

    public Student(){
        firstName = "no name";
        lastName = "no name";
        classes = 0;
    }

    //overloaded constructor
    public Student(String theFirstName, String theLastName, int theClasses){

        firstName = theFirstName;
        lastName = theLastName;
        classes = theClasses;
        System.out.println("Number of Classes: " + classes);
    }

    //Populating array
    public void createClassList(int classes){

        //Call array method
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        try{    
            for(int i = 0; i < classes; i++){
                System.out.println("Number of Classes: " + classes);
                System.out.println("Enter class " + i + ":");
                String input = br.readLine();
                classesList[i] = input;
            }
        }
        catch (IOException ioe) { 
            System.out.println("An unexpected error occured.");
        }
    }

    //Getters
    public String getFirstName(){ return firstName; }

    public String getLasName(){ return lastName; }

    public int getNumberOfClasses(){ return classes; }

    //Setters
    public void setFirstName(String newFirstName){
        firstName = newFirstName;
    }

    public void setLastName(String newLastName){
        firstName = newLastName;
    }

    public void setNumberOfClasses(int newNumberOfClasses){
        classes = newNumberOfClasses;
    }
}

抱歉,如果我粘贴的有点不正确。

我正在尝试创建一个程序来构建学生列表,其中包含他们的名字、姓氏和班级列表。但是,我进入第一堂课后一直遇到这个错误:

ABRT problem creation: 'success'
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at Student.createClassList(Student.java:37)
at StudentMenu.menu(StudentMenu.java:37)
at studentDemo.main(studentDemo.java:10)

这是错误之前的输出:

Choose an option: 
1) Add a student 
2) Display student list 
3) Exit 
1
Choice: 1
First name: 
t
Last name: 
s
Number of classes to add for student: 
3
Enter class 0:
eng

在输入 eng 后立即出现错误。
据我所知,不应该有 OutOfBoundsException,因为 3 是索引的限制,我只输入了一个类。

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 您可以尝试正确粘贴代码吗?它会帮助我们帮助您。

标签: java arrays methods arraylist


【解决方案1】:

这个:

private int classes; // default value of 0

private String[] classesList = new String[classes];

创建一个长度为 0 的字符串数组,这对您没有多大用处。像您一样将 classesList 数组声明为一个字段,但仅在 使用可行的非 0 int 值设置类之后为其分配一个新数组。

【讨论】:

  • 感谢您回复我。我尝试在构造函数之后创建 classesList。我认为这会给 classes 变量一个值,不是吗?它似乎仍然无法正常工作。
  • @WaterlessStraw:请告诉更多。 “它似乎仍然无法正常工作”告诉我们一点用处。
【解决方案2】:
private String[] classesList = null;

//overloaded constructor
public Student(String theFirstName, String theLastName, int theClasses)
{
    firstName = theFirstName;
    lastName = theLastName;
    classes = theClasses;

    classesList = new String[classes]; // THIS

    System.out.println("Number of Classes: " + classes);
}

试试这个?

您的代码的另一个问题:

public Student func = new Student();
List<Student> studentList = new ArrayList<Student>();

studentList.add(new Student(input, input2, numberOfClasses));
func.createClassList(numberOfClasses);

您应该注意到,func 是使用默认构造函数创建的。
Student 类中的 classes 变量不会使用任何适当的值初始化,并且 Student 类中的 String[] 将不会正确创建!
您在 使用默认构造函数创建的 func 上调用 createClassList,而不是使用用户输入的 numberOfClasses 值。

请阅读我所说的,WaterlessStraw! :)

您可能想要做的事情:

public Student func = null;
List<Student> studentList = new ArrayList<Student>();

func = new Student(input, input2, numberOfClasses);
studentList.add(func);
func.createClassList(numberOfClasses);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    相关资源
    最近更新 更多