我在我正在制作的程序中遇到问题,我无法弄清楚问题是什么。我已经做了几个较小的测试类来试图弄清楚问题是什么,但我不明白。我确定这是关于Arrays如何工作或其他什么的一些基本的东西,但我似乎无法记住什么。所以我在这里发布课程,希望你们知道什么是错的。谢谢!
public class Main {
public static void main(String[] args) {
TestArray t = new TestArray(8);
t.set(1, 15);
t.print();
}
}
public class TestArray {
private Word[] a;
public TestArray(int i){
a = new Word[i];
}
public void set(int pos, long value){
a[pos].set(value);
}
public void print(){
for(Word w : a){
System.out.println(w);
}
}
}
public class Word {
private long value;
public Word(long value){
this.value = value;
}
public void set(long value){
this.value = value;
}
public String toString(){
return String.valueOf(value);
}
}
当我尝试执行t.set(1,15)时,出现错误,Eclipse说该行有问题:a [pos] .set(value);
答案 0 :(得分:4)
您尚未初始化Word[] a
变量的实际元素。如果他们在TestArray.set
方法中为空,请对其进行初始化。
if (a[pos] == null)
a[pos] = new Word(value);
else
a[pos].set(value);
Java中对象数组的值初始化为null
,这与原始数组的初始化方式(全部为零或等价)相反。因此,当您通过new Word[i]
创建数组时,您实际上正在创建一个null
元素数组,您必须相应地设置它们。
在set方法中执行此操作可确保您不会创建任何未使用的Word
对象。这称为lazy initialization。另一种方法是将它们全部初始化为构造函数中的某个默认值:
public TestArray(int i){
a = new Word[i];
for (int index = 0; index < i; index++) {
a[index] = new Word(0); // Or some other default besides 0, like -1
}
}
根据您的评论:
这似乎是最好的方式,但我实际上尝试过:( for-each code)。在问这里之前,这不起作用。为什么呢?
您的代码:
public TestArray(int i) {
a = new Word[i];
for(Word w:a) {
w = new Word(0);
}
}
不能正常工作,因为w
不是像a[index]
这样的实际引用。在数组的for-each循环中,您的代码在编译时实际执行此操作:
for (int $i = 0; $i < a.length; $i++) {
Word w = a[$i];
w = new Word(0);
}
正如您所看到的,您要为局部变量w
分配值,而不是a
中的实际元素,因此数组不会被更改。一句话:不要被$
变量抛弃,因为1)$
在Java变量名中是合法的(尽管你不应该明确地使用它们)和2)Java生成这些变量时它编译你的代码(可以在适当的调试器中看到)。
答案 1 :(得分:3)
您分配一个数组,但在访问元素之前不要在数组元素中放置任何内容。
a[pos].set(value);
尝试访问[pos]中的任何内容,即null。
您需要遍历数组,为每个数组元素分配一个新的TestArray实例。