论坛首页 入门技术论坛

Java中的引用传递参数 为什么错误?

浏览 9232 次
该帖已经被评为新手帖
作者 正文
   发表时间: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");
	}
   发表时间:2011-10-12   最后修改:2011-10-12
值传递而非引用传递
0 请登录后投票
   发表时间: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");
	}


去查查引用传递
0 请登录后投票
   发表时间:2011-10-12  
如果在test()之前new应该不会出错吧
0 请登录后投票
   发表时间:2011-10-12  
test() 方法里面的 a变量 和 main方法里面的 a变量
引用了不同的对象。

参数传递中只是引用传递, 如果再调用方法内部修改引用是没有用的。
0 请登录后投票
   发表时间: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)方法体里才创建实例么?

0 请登录后投票
   发表时间: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,从而导致了下一句的错误~
1 请登录后投票
   发表时间:2011-10-12  
java和c的引用传递不太一样,具体楼主去找点文章看看,如果在test前如果初始化了a,你在test里面修改这个对象是可以的,但是如果你在test里面试图改变a的指针的指向,这时候main里面的a是不会受影响的。。。
0 请登录后投票
   发表时间:2011-10-12  
java里面只有值传递,没有引用传递(这样好理解)。
调用test(a)时,是拷贝了一个另一个引用值,让它类似的指向null。
所以穿进去的是拷贝的a。。。,在方法里面修改对象,a当然不会收到影响。

把 a = new ArrayList<String>();写到main方法里,就不会有错了。

a.size也会有值的。因为2个应用指向同一个对象,所以就有值了。。
1 请登录后投票
   发表时间: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");

这样是可以滴
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics