我用Java编写了一个模拟,但在运行时遇到了一些问题。我创建的用于模拟模型各方面的自定义类似乎永远不会被初始化。例如,
public class Queue {
public static int front = -1;
public static int length = 0;
public static int capacity = 0;
public static int roadqueue[];
public static int position[];
public static boolean full = false;
public static void push(int pushValue) {
然后可以从类中运行的函数。
在我的主项目中,我按如下方式声明了这个类:
public class myProject {
public static Queue queue[] = new Queue[33];
然后在main函数中,我首先调用一个函数来初始化这个类中的值:
public static void main(String[] args) {
initQueue();
与
public static void initQueue() {
queue[0].length = 6000;
queue[14].length = 6000;
queue[1].length = 20;
queue[13].length = 20;
queue[3].length = 10;
queue[11].length = 10;
queue[4].length = 360;
queue[12].length = 360;
queue[5].length = 260;
queue[10].length = 260;
queue[6].length = 20;
queue[9].length = 400;
queue[15].length = 460;
queue[22].length = 460;
queue[16].length = 260;
queue[21].length = 260;
queue[17].length = 100;
queue[26].length = 100;
queue[18].length = 160;
queue[20].length = 140;
queue[23].length = 240;
queue[25].length = 140;
queue[27].length = 80;
queue[32].length = 80;
queue[28].length = 480;
queue[31].length = 140;
for (int i = 0; i < 33; i++) {
if (i == 3 || i == 12)
queue[i].capacity = 40;
else
queue[i].capacity = queue[i].length / 10;
queue[i].position = new int[queue[i].capacity];
queue[i].roadqueue = new int[queue[i].capacity];
}
}
但是,当我运行项目并插入断点时,for循环开始迭代,但Netbeans通知我,例如在
queue[0].length = 6000;
“length引用一个null对象”,并且在变量explorer中,queue []中的所有值在整个程序中保持为null。知道我做错了吗?
答案 0 :(得分:4)
数组的所有元素都会自动初始化为其默认值(在您的情况下为null
)。你有一个33个null Queue
的数组。
正如其他人所建议的,您需要在使用之前为您的元素分配Queue
的实例
queue[i] = new Queue();
//now you can use queue[i]
LE:顺便说一句,我怀疑你希望Queue
中的这些字段是static
。您正在创建一个Queue
的数组,这些数组都具有相同的字段。您可能希望从这些字段中删除static
关键字(这可能还包括从您的某些static
方法中移除Queue
)。
答案 1 :(得分:2)
这一行:
public static Queue queue[] = new Queue[33];
...只创建数组。您仍然需要在数组中创建条目,例如:
queue[0] = new Queue();
如果你从一开始就考虑为什么你有一个数组,这种区别就特别有意义:它中的每个对象可能有不同的状态。所以使用一个抽象的例子:
// Create a Person array
Person[] people = new Person[3];
// Add Joe, Mohammed, and Maria to it
people[0] = new Person("Joe");
people[1] = new Person("Mohammed");
people[2] = new Person("Maria");
(我在那里使用了显式索引,但通常你会遍历并使用循环变量。)
但请注意Jon Skeet在评论中提到的非常重要事项:您的Queue
班级成员都是static
,因此只有一个一个< / strong> length
(例如)整个班级。正因为如此,并且由于Java的怪癖,这一行:
queue[0].length = 6000;
实际上执行此操作:
Queue.length = 6000;
您希望使这些成员成为实例成员(从中删除static
),将它们初始化为构造函数中的相关值,并初始化数组中的条目(上面的queue[x] = new Queue();
)。 / p>
答案 2 :(得分:1)
在Java中创建数组时,它会自己分配数组 - 但是Array中的所有内容都为null。基本上你创造了一条有许多房屋的街道,但没有建造任何房屋。
在你可以对房屋做任何事情之前,你需要在每个地块上建造房屋。
因此,循环队列,创建Queue
个对象。
for (int i=0;i<queue.length;i++) {
queue[i] = new Queue();
}
答案 3 :(得分:0)
Queue queue[] = new Queue[33];
您的数组是Queue
类型,它是Object
。初始化阵列的那一刻。所有元素都将分配给它的默认值,在这种情况下它是null
,因为Object
的默认值是null
。
答案 4 :(得分:0)
我认为你错过了,你只有一个Queue对象。你需要在阵列的每个位置都有一个。
喜欢
queue[1] = new Queue();