您遇到的问题是由于在Java中,方法的参数是按值传递的。这意味着每个参数都被有效地“复制”到方法中,这意味着您对参数所做的任何分配仅在方法中可见,并且不会被调用方看到。
通过你的例子,你传入一个空引用List<String>
的数组。这个引用然后被“复制”到func()
方法中,当func然后为这个变量赋值的时候,它只是被更新的局部变量,而不是你的调用代码所持有的引用。
下面是一些编译代码(根据您的示例)演示该问题:
public class Main {
public static void main(String[] args) {
List<String>[] array = null;
fill(array);
System.out.println("In main(): " + array[0].get(0));
}
public static void fill(List<String>[] array) {
array = (List<String>[])new List[10];
array[0] = new ArrayList<String>();
array[0].add("test");
System.out.println("In fill(): " + array[0].get(0));
}
}
在填补println
打印正确的值,因为array
变量已被分配到填充方法中的东西,但是主要方法中的println
将抛出一个NPE,因为只有数组变量的“副本”被func
更改了,而不是“真正的”变量。
解决此问题的方法有两种:在调用代码中实例化数组,或更改fill()
方法以返回已创建数组的引用。
下面是第一种方法:
public class Main {
public static void main(String[] args) {
List<String>[] array = (List<String>[])new List[10];
fill(array);
System.out.println("In main(): " + array[0].get(0));
}
public static void fill(List<String>[] array) {
array[0] = new ArrayList<String>();
array[0].add("test");
System.out.println("In fill(): " + array[0].get(0));
}
}
,你可能会奇怪,为什么这个作品,因为你仍然分配ArrayList
年代到数组的元素,但这些对象调用的外部可见方法。原因是尽管填充方法获得了对数组引用的“复制”,但引用本身仍然引用相同的数组对象。这意味着你可以修改数组对象的内部状态,调用者可以看到你所做的任何更改,因为它引用了同一个对象。
下面是第二种方法:
public class Main {
public static void main(String[] args) {
List<String>[] array = fill();
System.out.println("In main(): " + array[0].get(0));
}
public static List<String>[] fill() {
List<String>[] array = (List<String>[])new List[10];
array[0] = new ArrayList<String>();
array[0].add("test");
System.out.println("In fill(): " + array[0].get(0));
return array;
}
}
(顺便说一句,你一般应尽量避免创建泛型集合的阵列,一个更好的主意是使用一个列表来存储列表自身的EG。 :
List<List<String>> list = new ArrayList<List<String>>();
list.add(new ArrayList<String>());
list.get(0).add("test");
我已经改正了我的问题,我其实想制造氩数组。 rayList。 –
athena
2010-03-20 07:19:06