Java 为什么我创建的对象保持为null?
我用Java编写了一个模拟,但在运行时遇到了一些问题。我创建的用于模拟模型方面的自定义类似乎从未初始化过。比如说,Java 为什么我创建的对象保持为null?,java,class,object,Java,Class,Object,我用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 bool
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();
与
“长度引用空对象”,并且在变量资源管理器中,队列[]中的所有值在整个程序中保持为空。知道我做错了什么吗?数组的所有元素都会自动初始化为其默认值(在您的例子中,
null
)。您有一个包含33个nullQueue
s的数组
正如其他人所建议的,在使用元素之前,您需要将Queue
的实例分配给元素
queue[i] = new Queue();
//now you can use queue[i]
乐:顺便说一句,我怀疑您是否希望队列中的那些字段是静态的。您正在创建一个队列
数组,所有队列都具有相同的字段。您可能希望从这些字段中删除static
关键字(这可能还包括从一些队列方法中删除static
。此行:
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");
(我在这里使用了显式索引,但通常需要循环并使用loop变量。)
但是请注意Jon Skeet在评论中提到的非常重要的一点:您的队列
类的成员都是静态的
,因此整个类只有一个长度
(例如)。正因为如此,也因为Java的一个怪癖,这一行:
queue[0].length = 6000;
实际上是这样的:
Queue.length = 6000;
您希望使这些成员成为实例成员(从它们中删除static
),将它们初始化为构造函数中的相关值,并初始化数组中的条目(上面的队列[x]=new queue();
).在Java中创建数组时,它会分配数组本身,但数组中的所有内容都是空的。基本上,你创建了一条街道,上面有很多房子,但没有建造任何房子
在你能对房子做任何事情之前,你需要在每个地块上建造房子
因此,在队列中循环,创建队列
对象
for (int i=0;i<queue.length;i++) {
queue[i] = new Queue();
}
for(int i=0;iQueue Queue[]=新队列[33];
你的数组是一个队列
类型,它是一个对象
。当你初始化数组的时候。所有元素都会分配给它的默认值,在这种情况下它是空的
,因为对象的默认值是空的
我想你失踪了,你只得到了一个队列对象。你需要阵列的每个位置都有一个
像
请展示一个简短但完整的程序来演示问题。与其展示所有单独的代码片段,不如展示一个完整的程序-它只需要大约10行长…您需要在数组的每个插槽中创建一个队列对象。即Queue[0]=new Queue();Queue[0].length=6000;
等等。为什么变量是静态的?这样,每个对象都有相同的值。我不相信这是正确的output@ZouZou:虽然通常情况下是这样,但长度
变量实际上是一个静态变量
变量,这意味着它不重要tself,但是…@JonSkeet你是对的,但是我看不到任何其他解释。也许OP将字段更改为非静态字段,然后忘记发布实际的代码…啊,非常感谢。我会试试这个,但听起来它会起作用。@Martin:看Jon Skeet的评论,你的队列
类的成员都是静态的让它们成为实例成员并初始化实例(根据上面的说明)更有意义@Boristespider但是数组元素是null
不管怎样。@user16547:是的,它们是null-但这不会导致NullPointerException,因为它们在提供的代码中没有被解除引用。你可以自己尝试。@Jonsket现在我明白了,这很微妙。@Jonsket:OMG,我现在明白了。Yikes。
Queue.length = 6000;
for (int i=0;i<queue.length;i++) {
queue[i] = new Queue();
}
queue[1] = new Queue();