Java对象数组崩溃

时间:2012-06-16 01:21:25

标签: java

Java noob问题:

考虑以下C数组和初始化代码:

struct {
  int x;
  int y;
} point_t;

point_t points[1000];

易。这会在加载时创建并分配内存。

现在考虑Java中的类似内容:

public class point_t
{
   public int x;
   public int y;
}

point_t points[] = new point_t[1000];
// Without this loop, java will crash when you run this
for (int i=0; i<1000; i++)
{
   points[i] = new point_t;
}
points[0].x = 10;  // Crash would occur here without above loop
points[1].x = 10;

最初我的java程序崩溃了一个空指针取消引用。问题是,来自C ++,我不知道你必须创建1000个point_t对象。只是一个评论,但这似乎是INSANE。假设阵列大小为100万或10亿。它只需几秒钟即可创建&#34;此数组在运行时具有空条目。在C ++中,它都发生在加载时。我承认你并不总是知道C ++阵列的单元格中会有什么,但在我工作的嵌入式系统中,内存通常被自动初始化为零,因此它可以工作。

当你有一个对象数组时,Java中有没有更简单,更快捷,更有效的方法来创建数组并分配内存?或者我在上面的代码中做错了什么?

4 个答案:

答案 0 :(得分:7)

由于您来自C ++背景,这可能有所帮助。在Java中,当你写

point_t points[] = new point_t[1000];

这类似于用C ++写作

point_t* points[] = new point_t*[1000];

也就是说,在Java中,当您创建数组时,您不是创建点对象数组,而是创建点引用数组,就像在C ++中创建点指针数组一样。 / p>

Java是一种托管(垃圾收集)语言;这就是Java程序员所期望的。

至于问题的第二部分,如何自己创建对象,你做的很好。在循环中创建1000个点对象并加载它们。如果你想要更短的代码,你可以编写一个很好的方法来完成这项工作。 :)

您还可以查看可能拥有这些便利工厂方法的其他集合库。

答案 1 :(得分:4)

书写

point_t[] points = new point_t[ 1000 ];

正在为point_t对象分配一千个引用。 (用C语言来说,它正在分配指向该类型结构的指针。)

那个循环

for (int i=0; i<1000; i++)
{
    points[i] = new point_t;
}

分配一个新的point_t对象,并将引用(指针)放在数组中。直到你这样做,数组只是空值,它可能给你空例外。

答案 2 :(得分:2)

那不是point_t个实例的数组;那些活在堆里。

它实际上是对堆上的point_t个实例的引用数组。

任何未通过分配给参考值而初始化的引用(例如通过调用new)都设置为null。

对于非数组引用类型也是如此。

public class Person {
    private String name; // not initialized; that means it's null
    public Person() {} // oops; constructor should have initialized name, but now it's null
    public String getName() { return name; } // returns null unless you set it properly
    public void setName(String newName) { this.name = newName; }
}

答案 3 :(得分:1)

您可以使用Flyweight pattern在不同对象之间共享相同的数据,并推迟创建点对象,直到确实需要为止