在Java

时间:2015-07-23 01:11:13

标签: java arrays

我想在Java类中有一个静态数组,最初的大小不确定。目的是使用数组将方法中计算的值存储在一个类中,并在另一个类中使用。

E.g。这里定义的' TwoDX(Y)Pos []数组:

public class DisplayObject {

    //  Each object is defined by a color, number of vertices, and dim (2,3,4) coordinate vertex locations
    //  Use dim to verify that the right number of vertices were sent

        public static int Dim=3;
        public static int RefDist=100;

        public static int TwoDXpos[];
        public static int TwoDYpos[];
}

并在此处使用:

    public void render2D(){

        for (int cnt=0; cnt<this.NoOfVerts; cnt++){
            if (this.coords[cnt*Dim+2] < RefDist) {break;}
            TwoDXpos[cnt]=this.coords[cnt*Dim]/(this.coords[cnt*Dim+2]/RefDist);
            TwoDYpos[cnt]=this.coords[cnt*Dim+1]/(this.coords[cnt*Dim+2]/RefDist);
        }
    }

但是,由于原始静态引用没有定义大小,因此它们在执行时引用Null指针。

你会如何创建这样的数组?

6 个答案:

答案 0 :(得分:1)

  

我想在一个最初未确定大小的java类中有一个静态数组。

对不起。

这在Java中是不可能的。 JLS-10.3. Array Creation说(部分)

  

数组的长度以final实例变量length的形式提供。

替代

但是,您可以拥有List Foo个像

List<Foo> al = new ArrayList<>();

答案 1 :(得分:1)

使用ArrayList代替数组。 您的代码应如下所示:

public class DisplayObject {

//  Each object is defined by a color, number of vertices, and dim (2,3,4) coordinate vertex locations
//  Use dim to verify that the right number of vertices were sent

    public static int Dim=3;
    public static int RefDist=100;

    public static ArrayList<Integer> TwoDXPos;
    public static ArrayList<Integer> TwoDYPos;
}

和渲染2d方法:

public void render2D(){

    for (int cnt=0; cnt<this.NoOfVerts; cnt++){
        if (this.coords[cnt*Dim+2] < RefDist) {break;}
        TwoDXpos.get(cnt)=this.coords[cnt*Dim]/(this.coords[cnt*Dim+2]/RefDist);
        TwoDYpos.get(cnt)=this.coords[cnt*Dim+1]/(this.coords[cnt*Dim+2]/RefDist);
    }
}

使用ArrayList的优势在于您可以使用其add(item)方法动态更改其大小。

希望它有所帮助!

答案 2 :(得分:0)

 public void render2D() {
    TwoDXpos = new int[this.NoOfVerts];
    TwoDYpos = new int[this.NoOfVerts];
    for (int cnt = 0; cnt < this.NoOfVerts; cnt++) {
        if (this.coords[cnt * Dim + 2] < RefDist) {
            break;
        }
        TwoDXpos[cnt] = this.coords[cnt * Dim] / (this.coords[cnt * Dim + 2] / RefDist);
        TwoDYpos[cnt] = this.coords[cnt * Dim + 1] / (this.coords[cnt * Dim + 2] / RefDist);
    }
 }

并按照Java命名规则命名变量:http://www.iwombat.com/standards/JavaStyleGuide.html#Attribute%20and%20Local%20Variable%20Names

答案 3 :(得分:0)

简短的回答是你需要在使用之前初始化数组。 为避免内存泄漏,应在初始化时设置其大小。 e.g.10。

public static int TwoDXpos [] = new int [10];  public static int TwoDYpos [] = new int [10];

如果数组大小发生变化,则应使用ArrayList,因为其大小由JVM自动管理

答案 4 :(得分:0)

您无法使用大小未确定的阵列。您应该在调用render2D()方法之前初始化数组大小。也许你可以使用this.NoOfVerts作为数组大小。

答案 5 :(得分:0)

如果要使用数组,则应通过提及数组的大小对其进行初始化,以便在使用之前分配内存。

public static int TwoDXpos[];
public static int TwoDYpos[];

对此的任何访问都会抛出NullPointerException,因为未分配和对象定义的内存根本没有发生。

你应该在数组(或任何对象)上记住这一点&#34;在访问/使用它们之前初始化&#34;

如果您担心的是,您不确定前期元素的数量,则应使用Java Collection Framework中提供的ArrayList等实用程序。随着元素数量的增加,这会随着动态调整大小。

替代方法

private static List<Integer> twoDXPos = new ArrayList<Integer>();
private static List<Integer> twoDYPos = new ArrayList<Integer>();

然后可以使用add类中的java.util.Collection方法添加迭代。 (参考我上面给出的链接)

twoDXPos.add(1) //1 is an example integer here to illustrate
twoDYPos.add(1) //1 is an example integer here to illustrate