2012-10-06 54 views
1

我正在为一个简单的程序为学校这是一个简单的字符串生成器,我正确定义数组大小,但是当我运行该程序时,抛出了ArrayIndexOutOfBoundsException: 0。我在构造函数,名称和类中初始化变量。 name是学生的名字,classes是学生每天有多少班。我的阵列的大小是使用classes定义的。这是我的构造函数和变量。阵列运行时错误

protected String name = ""; 
protected int classes; 
private String schedule = ""; 
private String[] course = new String[classes]; 
private String[] room = new String[classes]; 
private int[] Period = new int[classes]; 

public StringBuilderHandler(String name, int classes) { 
    this.name = name; 
    this.classes = classes; 
} 

我正在使用for循环来设置什么是String schedule。

private void setClass(int index) { 
    Scanner scan = new Scanner(System.in); 
    class[index] = scan.nextLine(); 
} 

private void setPeriod(int index) { 
    Scanner scan = new Scanner(System.in); 
    period[index] = scan.nextInt(); 
} 

public void setRoom(int index) { 
    Scanner scan = new Scanner(System.in); 
    room[index] = scan.nextLine();  
} 

public void buildSchedule() { 
    for (int i = 0; i < classes; i++) { 
     System.out.println("What is your class?"); 
     setClass(i); 
     System.out.println("What period is this class?"); 
     setPeriod(i); 
     System.out.println("What room is this class?"); 
     setRoom(i); 
     schedule = schedule +"Period "+period[i]+"\t"+course[i]+"\tRoom "+room[i]+"\n"; 
    } 
} 

任何想法?

+0

setClass'中的'class [index]'不应该是'course [index]'吗? –

+0

不要忘记接受答案,因为已经发布了一些好的答案。 – CKing

+0

@AVD:请阅读作业标签wiki – Mat

回答

2

您的类实例变量的默认值为0,因为您尚未初始化它。所有你的数组因此被初始化为零大小。你正在得到一个异常,因为没有索引0,因为数组的大小为零。您需要将类实例变量初始化为非零正值。

如果您尝试向数组中插入比其大小更大的值,您仍然可能会收到ArrayIndexOutOfBoundsException。一个快速的解决方案是使用ArrayList而不是数组。

0

你是否在任何地方初始化了这个变量类?

您已初始化所有大小类的数组,但类似乎并未初始化。

+0

在主类中,我使用Scanner类中的方法来初始化名称和类。 – Dan

3

必须必须在构造函数内创建对象(数组)。

private String[] course; 
private String[] room; 
private int[] Period; 

public StringBuilderHandler(String name, int classes) { 
    this.name = name; 
    this.classes = classes; 
    this.course = new String[classes]; 
    this.room = new String[classes]; 
    this.Period = new int[classes]; 
} 
+1

这使得代码更清晰,但是如果值0传递给类参数的构造函数,仍然有可能发生ArrayIndexOutOfBoundsException。最理想的是使用ArrayList – CKing

+0

@bot同意!当然''数组''需要更多的关注。 – adatapost

+0

谢谢,这完全让我大跌眼镜,这有点令人尴尬。 @bot是的,但我的老师只允许我们使用特定的方法。 – Dan

2

你只需要定义你的类为:

protected String name = ""; 
protected int classes; 
private String schedule = ""; 
private String[] course; 
private String[] room; 
private int[] Period; 

public StringBuilderHandler(String name, int classes) { 
    this.name = name; 
    this.classes = classes; 
    this.course = new String[classes]; 
    this.room = new String[classes]; 
    this.Period = new int[classes]; 
} 

可以肯定它会工作。您正在使用类变量而无需初始化它,因为它在运行时初始化。当类有一个值时,你只需要在构造函数中初始化数组。

+0

这是如何解决问题的?如果我将一个0值传递给类参数的构造函数,该怎么办?更改代码结构不会隐含地使异常消失。这并没有回答这个问题。 – CKing

+0

@你说得对。但是这个问题只能由程序员解决,因为他必须确保0不能通过方法。这些类型的问题由程序员处理。 – MouseCrasher

+0

你错过了这一点。与我们阵列的东西,他们有一个固定的大小。你不能在特定的索引之外添加元素,否则你会得到一个ArrayIndexOutOfBoundsException。那么你怎么做才能将更多的元素添加到已经完整的数组中呢?您可以创建一个新的数组,它的大小是它的两倍,并将其内容复制到这个数组中,或者您只需使用ArrayList。我希望你明白为什么你的答案不能解决问题。看到我的答案。 – CKing