2013-12-13 33 views
0

我已经用Java编写了一个模拟程序,但运行时遇到了一些问题。我为模拟模型的各个方面而创建的自定义类似乎从未初始化过。例如,为什么我创建的对象处于null状态?

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]; 

,然后在主函数中,我调用了应该在这个类初始化值功能的第一件事:

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; 

“长度引用空对象”,并在可变Explorer在队列[]中的所有值在整个程序中保持零。任何想法我做错了什么?

+0

请出示一个*短* *,但完整的*程序演示该问题。而不是所有单独的片段,只显示一个完整的程序 - 它只需要大约10行... –

+2

您需要在阵列的每个插槽中创建一个队列对象。 I.e'queue [0] = new Queue();队列[0] .length = 6000;'等 –

+3

为什么变量是静态的?这样,每个对象都具有相同的值。我不认为这是正确的输出 –

回答

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"); 

(我用明确的指标有,但通常你会遍历并使用循环变量。)

但需要注意的非常重要的事情乔恩斯基特在评论中提到:您的Queue班级的成员全都是static,因此整个班级只有一个一个length(例如)。正因为如此,而且由于Java的,此行的一个怪癖:

queue[0].length = 6000; 

实际上做到这一点:

Queue.length = 6000; 

你想使这些成员的实例成员(从他们身上取出static) ,在构造函数中将它们初始化为相关值,并初始化数组中的条目(上面的queue[x] = new Queue();)。

+0

啊,万分感谢。我会试试这个,但听起来它会起作用。 – Martin

+0

@Martin:参见Jon Skeet的评论,你的'Queue'类的成员都是'static'。使它们成为实例成员并初始化实例会更有意义(根据上述)。 –

4

数组的所有元素都会自动初始化为默认值(在您的情况下,null)。您有33个空值的阵列Queue s。

正如其他人的建议,你需要使用它们

queue[i] = new Queue(); 
//now you can use queue[i] 

LE之前分配的Queue到元素实例:顺便说一下,我怀疑你想在Queue这些领域是static。您正在创建一个Queue的数组,它们都具有相同的字段。您可能需要从这些字段中删除static关键字(这可能还包括从Queue某些方法中删除static)。

+0

不确定这是否有帮助,因为'Queue'中的所有变量都是'static' ...无论如何... –

+2

@BoristheSpider但无论如何,数组元素都是'null'。 – async

+2

@ user16547:是的,它们是空的 - 但不会导致NullPointerException,因为它们没有在提供的代码中被取消引用。你可以自己尝试。 –

1

当您在Java中创建数组时,它会分配数组本身 - 但Array内的所有内容都为null。本质上,你创建了一个有很多房屋的地块的街道,但不建造任何房屋。

你需要在每个地块都经过建筑房屋,然后才能对房屋做任何事情。

因此循环遍历队列,创建Queue对象。

for (int i=0;i<queue.length;i++) { 
    queue[i] = new Queue(); 
} 
0

Queue queue[] = new Queue[33];你的阵列是Queue类型,它是一个Object。你初始化你的数组的那一刻。所有元素将分配给它的默认值,在这种情况下,它是null,因为Object的默认值是null

0

我想你想不到,只有你有队列对象。你需要在阵列的每个位置都有一个。

queue[1] = new Queue(); 
相关问题