(关于List)为什么这个程序不报错?

t427795737 2007-12-26 09:06:53
各位高手,下面这个程序调用了test2()方法后在打印list的长度应该是报错的?因为我在test2()中将list设置成null了,但是实际上为什么能通过编译并且能运行呢?结果是0和1

import java.util.*;
public class TestClass
{
public static void main(String[] args)
{
List list = new ArrayList();
test2(list);
System.out.println(list.size());
test3(list);
System.out.println(list.size());
//List list1 = null;
//System.out.println(list1.size());
}

public static void test2(List list)
{
list = null;
}

public static void test3(List list)
{
list.add("aaaa");
}
}
...全文
124 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
老紫竹 2007-12-27
  • 打赏
  • 举报
回复
java里面所有参数都是传值的.

意思能理解,可是不能这么说阿。
java里面所有方法,如果是对象的话,穿过去的是对象的引用地址,

test2(list);
你把 main 里面list指向的对象地址传过去了

public static void test2(List list)
{
// 这里的 list 是一个本地变量,此list非main里面的list,不过他们指向了同一个对象
list = null;
// 你把本地变量指向了null, 并不会影响main里面的 list 哦
}



public static void test3(List list)
{
list.add("aaaa");
// 此操作直接对list指向的对象进行了操作,因为main里面的list指向同一个对象,所以在那面能访问到
}

总结:

java传递对象类似于C里面的内存指针哦。2个变量指向了同一个地址。test是修改变量自己的指针,test3是修改被指向地址的那块内存的内容
Rush_2008 2007-12-26
  • 打赏
  • 举报
回复

你只是打印List的长度,肯定不会报NullPointerException,如果是获取其中的值,例如list.get(0)就会报这个错误了
wusilou 2007-12-26
  • 打赏
  • 举报
回复
4楼的很清楚,学习中!
xpzheng 2007-12-26
  • 打赏
  • 举报
回复
JAVA中对象作为参数,其实传递的是对象引用的一个拷贝,在test2方法中,只是将拷贝重新指向了一个地方,但是原来的那个对象指向的内存并没有被改变,所以不报空指针异常。
wdman 2007-12-26
  • 打赏
  • 举报
回复
java里面所有参数都是传值的.
也就是说

List list = new ArrayList(); -------------- No1

public static void test2(List list)
{
list = null; -------------- No2
}

No2的list只是No1的list的一个copy,它们指向的对象是一样的,但是通过list=null赋值只是改变了No2的list,
No1的list没有变,但是通过list.add("aaaa"); 是改变了No1的list和No2的list指向的对象的内容.

如果对Java理解不深的话,尽量避免这种编程方式.
t427795737 2007-12-26
  • 打赏
  • 举报
回复
怎么不是报错NullPointerException呢?
lihaifeng0412 2007-12-26
  • 打赏
  • 举报
回复
赋值空置长度不就是0吗
wusilou 2007-12-26
  • 打赏
  • 举报
回复
你要打印的是list的长度,又不是list的值!那你认为要报什么错?

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧