我在编译java项目时遇到问题,因为数组长度整数(这是一个变量)在我的Object数组中没有正确替换。
import java.util.Arrays;
public class ObjectList {
private int N;
private Object[] fractionList = new Object[N];
public ObjectList(int n){
this.N = n;
}
public int capacity(){
return this.N;
}
public void setN(int n){
this.N = n;
}
public String toString(){
return Arrays.toString(fractionList);
}
}
public class FractionDriver {
public static void main(String[] args){
// creates the object list, sets N to 4
ObjectList list = new ObjectList(4);
System.out.println("The Objectlist has " + list.capacity() + " lines");
// prints the array
System.out.println(list.toString());
}
}
这是编译器输出的内容:
The ObjectList has 4 lines
[]
因此,我无法向我的数组添加任何对象。编译器抛出一个ArrayIndexOutOfBoundsException:0并告诉我数组中没有元素。
如果我选择在对象数组实例变量中替换N,如下所示:
private Object[] fractionList = new Object[4];
编译器很满意并将数组长度设置为4。
我做错了什么?
答案 0 :(得分:4)
您可以在构造函数中创建数组实例,其长度已知:
private Object[] fractionList;
public ObjectList(int n){
this.N = n;
this.fractionList = new Object[n];
}
但是,您可能还希望在更改N的值时重新创建数组:
public void setN(int n){
this.N = n;
// consider copying data from the old array to the new array
this.fractionList = new Object[n];
}
答案 1 :(得分:2)
问题在于行
private Object[] fractionList = new Object[N];
在构造函数之前执行。初始化顺序总是如下:
您希望构造函数(4)中的代码设置数组长度,但数组已在实例变量(3)中创建。
我建议如下:
public class ObjectList {
private int N;
private Object[] fractionList;
public ObjectList(int n){
fractionList = new Object[n];
this.N = n;
}
public int capacity(){
return this.N;
}
public void setN(int n){
// might want to copy content from old array to new one here
fractionList = new Object[n];
this.N = n;
}
public String toString(){
return Arrays.toString(fractionList);
}
}
如果您想要遵守Java Bean,我还建议您将capacity()
方法重命名为getCapacity()
。
答案 2 :(得分:1)
首先,这不是编译错误。该程序编译正常。问题是数组fractionList
在之前被初始化,在设置变量N
的情况下调用构造函数的主体。
您可以将初始化移动到构造函数:
private Object[] fractionList;
public ObjectList(int n) {
this.N = n;
fractionList = new Object[N];
}
答案 3 :(得分:0)
嗯......简单来说,当Object[] fractionList
被初始化时,字段N
的值是“不可见的”,因为在调用this.N = n;
之前不会设置它的值,与文字编号4不同,后者是编译时常量。
您可以将参数N
传递给构造函数以初始化数组。类似的东西:
public ObjectList(int n){
this.fractionList = new Object[n];
}