锁定老帖子 主题:Java中的引用传递参数 为什么错误?
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-10-12
public static void main(String[] args) { List<String> a=null; test(a); System.out.println(a.size()); } public static void test(List<String> a) { a = new ArrayList<String>(); a.add("cc"); } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-10-12
最后修改:2011-10-12
值传递而非引用传递
|
|
返回顶楼 | |
发表时间:2011-10-12
NSCoffee 写道 请问下面的代码为什么会出现错误?
public static void main(String[] args) { List<String> a=null; test(a); System.out.println(a.size()); } public static void test(List<String> a) { a = new ArrayList<String>(); a.add("cc"); } 去查查引用传递 |
|
返回顶楼 | |
发表时间:2011-10-12
如果在test()之前new应该不会出错吧
|
|
返回顶楼 | |
发表时间:2011-10-12
test() 方法里面的 a变量 和 main方法里面的 a变量
引用了不同的对象。 参数传递中只是引用传递, 如果再调用方法内部修改引用是没有用的。 |
|
返回顶楼 | |
发表时间:2011-10-12
我觉得是这样:
public static void main(String[] args) { List<String> a=null; test(a);//这里a 的值是null; System.out.println(a.size()); } public static void test(List<String> a) { a = new ArrayList<String>(); a.add("cc"); } 首先这个代码在运行时就会出错,将会抛出nullPointerException,出错在于,第3行 test(a); 因为方法调用时,jvm会检查参数,是null就会抛出出nullPointerException。 而且在test(List<String> a)方法实现上,不知道为什么要这么实现,上面代码意思是想把a 在test(List<String> a)方法体里才创建实例么? |
|
返回顶楼 | |
发表时间:2011-10-12
BBjava 写道 我觉得是这样:
public static void main(String[] args) { List<String> a=null; test(a);//这里a 的值是null; System.out.println(a.size()); } public static void test(List<String> a) { a = new ArrayList<String>(); a.add("cc"); } 首先这个代码在运行时就会出错,将会抛出nullPointerException,出错在于,第3行 test(a); 因为方法调用时,jvm会检查参数,是null就会抛出出nullPointerException。 而且在test(List<String> a)方法实现上,不知道为什么要这么实现,上面代码意思是想把a 在test(List<String> a)方法体里才创建实例么? 没有文化真可怕,这里的错误不是由于调用了test()方法,而是由于System.out.println(a.size());这句导致的~ java是传值引用,所以test方法里对a任何操作都与main方法里的a无关~,当test()方法返回后,main方法的a还是null,从而导致了下一句的错误~ |
|
返回顶楼 | |
发表时间:2011-10-12
java和c的引用传递不太一样,具体楼主去找点文章看看,如果在test前如果初始化了a,你在test里面修改这个对象是可以的,但是如果你在test里面试图改变a的指针的指向,这时候main里面的a是不会受影响的。。。
|
|
返回顶楼 | |
发表时间:2011-10-12
java里面只有值传递,没有引用传递(这样好理解)。
调用test(a)时,是拷贝了一个另一个引用值,让它类似的指向null。 所以穿进去的是拷贝的a。。。,在方法里面修改对象,a当然不会收到影响。 把 a = new ArrayList<String>();写到main方法里,就不会有错了。 a.size也会有值的。因为2个应用指向同一个对象,所以就有值了。。 |
|
返回顶楼 | |
发表时间:2011-10-12
public static void main(String[] args) {
List<String> a = new ArrayList<String>(); a.add("cc"); test(a); System.out.println(a.size());//3 } public static void test(List<String> a) { a.add("cc"); a.add("bb"); } 这样是可以滴 |
|
返回顶楼 | |