Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我创建的对象保持为null?_Java_Class_Object - Fatal编程技术网

Java 为什么我创建的对象保持为null?

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

我用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();


“长度引用空对象”,并且在变量资源管理器中,队列[]中的所有值在整个程序中保持为空。知道我做错了什么吗?

数组的所有元素都会自动初始化为其默认值(在您的例子中,
null
)。您有一个包含33个null
Queue
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;i
Queue 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();