关于空指针问题

冰封情 发布于 2011/01/16 20:46
阅读 457
收藏 1

华为云11月刊推送:DIY微信问答机器人,高性能计算代码的20个技巧!>>>

	public static void main(String[] args) {
		List lst = new ArrayList();
		lst.add("hao");
		System.out.println(lst.hashCode());
		System.out.println(lst==null);
		del(lst);//运行设置为null
		System.out.println(lst.hashCode());
		System.out.println(lst.get(0));//但是事实上!=null
	}
	
	public static void del(List lst){
		System.out.println(lst.hashCode());
		lst=null;//子方法中设置=null
		System.out.println(lst==null);
	}

    public static void close(ResultSet rs) throws SQLException {
        if (rs != null) {
            rs.close();
        }
    }

昨天晚上在看DbUtil这个东东,发现里面传递的ResultSet 对象 判断了是否=null

我们习惯性会在里面设置 rs=null

但是发现rs=null其实也没有用,才猛然发现DbUtil原来也是没怎么做,为什么传递的对象设置了null

但是父方法里面还不是null

很奇怪的问题

加载中
0
二零一九是猪年
二零一九是猪年

下面是我修改后的代码:

如有不对,请赐教!del(lst)这个lst是对其进行了一个拷贝。

0
冰封情
冰封情
		lst.remove(0);
		System.out.println(lst.hashCode());
		lst=null;
		System.out.println(lst==null);

你说的没错啊!是没有删除,但是hashCode是一样的。以前都认为这个传递的是同一个对象,

如果对list的内容做删除

又是可以删除的,这样说的话copy也说的不对了。

0
fake
fake

这个问题其实回到c++的层面来考虑就很清楚了,方法中传递的是对象的地址引用,对该参数所引用的对象所作的一切操作其实都是对原对象的操作,但是将该参数设置为空,那就只是该参数的问题了,不涉及到对象的内容的了

0
冰封情
冰封情

引用来自#4楼“fake”的帖子

这个问题其实回到c++的层面来考虑就很清楚了,方法中传递的是对象的地址引用,对该参数所引用的对象所作的一切操作其实都是对原对象的操作,但是将该参数设置为空,那就只是该参数的问题了,不涉及到对象的内容的了

 那为什么传递过去设置=null,还是不行呢?

0
蔡华江
蔡华江

Java里的参数传递方式应该是最好理解的了。

在一个方法里,直接对参数(参数或参数的引用本身)的赋值只在该方法体有效。

0
jumkey
jumkey

lst 保存的是对象的地址。

0
疯狂的艺术家
疯狂的艺术家

引用来自#6楼“蔡华江”的帖子

Java里的参数传递方式应该是最好理解的了。

在一个方法里,直接对参数(参数或参数的引用本身)的赋值只在该方法体有效。

正解。

调用方法和被调用方法都具有该引用(地址)的完全相同的副本,

做赋值操作仅仅是将副本做了修改,

如果直接remove(0) 对 引用(地址)进行操作 ,则是对引用(地址)的对象进行操作。

相当于有一个锁,有两把钥匙,

我给了你一把钥匙,你把钥匙砸了,那么你说我的另一把钥匙开锁后,里面东西是不是都还在呢

所以出现了你所遇到的现象。

至于大家习惯的在最后设置为空,应该是让jc更快的回收吧。

0
冰封情
冰封情

引用来自#8楼“heguangdong”的帖子

引用来自#6楼“蔡华江”的帖子

Java里的参数传递方式应该是最好理解的了。

在一个方法里,直接对参数(参数或参数的引用本身)的赋值只在该方法体有效。

正解。

调用方法和被调用方法都具有该引用(地址)的完全相同的副本,

做赋值操作仅仅是将副本做了修改,

如果直接remove(0) 对 引用(地址)进行操作 ,则是对引用(地址)的对象进行操作。

相当于有一个锁,有两把钥匙,

我给了你一把钥匙,你把钥匙砸了,那么你说我的另一把钥匙开锁后,里面东西是不是都还在呢

所以出现了你所遇到的现象。

至于大家习惯的在最后设置为空,应该是让jc更快的回收吧。

 多谢各位!

返回顶部
顶部