我想在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指针。
你会如何创建这样的数组?
答案 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