关于资源释放问题

关于资源释放问题

以下是课件资源释放代码:

if (rs != null) {

try {

rs.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

rs = null;

}

前面已经使用里close()方法关闭了,为什么最后还要来个rs=null?为何不一开始就来个rs=null,这不是一句代码就解决了吗?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,

1、这个把rs赋值为null后,以后再执行这个finally块儿的时候(rs没有再次被赋值的情况下),它就不需要再去执行if(rs!=null)里面的内容了。打个比方, 假如载有货物的货车需要交卸货费,如果这个车不是空的,那么我们调用方法去卸货,卸完货之后,人家就给了我们一个牌子,上边写了“空车”。那下次再走到这儿的时候,一看是“空车”,就不需要再去执行卸货的那一套流程了。这个给了一个“空车”牌子的过程就好比是rs=null的过程哦。 同学也可以理解为,关闭这流后,人家给了我们一个证明。证明已经关过了,再次经过这儿的时候,不需要再次关闭。

2、rs置为null后,也是为了可以把rs垃圾回收。

不知道老师是否理解对了同学的疑问,如果老师理解错了同学的疑问,还请同学再次描述一下。


如果我的回答解决了你的疑惑,请采纳!祝学习愉快!


  • 慕沐8221787 提问者 #1
    执行rs.close()后,系统不是就可以进行垃圾回收了吗?为什么还要rs=null,岂不是多次启动垃圾回收机制吗?
    2019-11-02 18:05:10
  • 好帮手慕阿莹 回复 提问者 慕沐8221787 #2
    同学你好,rs.close()后系统并不会对rs立即进行垃圾回收(这里我们无法控制什么时候被回收),而rs被置为null的时候,则会加速垃圾回收(对象被置为null满足可以被回收的条件,有可能会比之前回收的快)。优化内存。 如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
    2019-11-02 18:22:56
好帮手慕阿莹 2019-11-02 14:45:55

1、首先rs=null并不是真正的关闭了流哦,要调用close()才是关闭了流,所以,close()方法还是需要调用的。

2、为什么要写rs=null

这里是因为,我们的代码是写到finally里的,finally代码块儿里的代码都是最后会去执行的,如果我们已经关掉了rs,我们就没有必要再去执行这段儿代码了。而怎样不让它执行这段儿代码呢?我们可以关闭后给它置为null,我们让它去判断一下是否为null,如果不为null就去调用关闭的代码,如果为null,说明我们有已经关闭了。则不必执行里边关闭的代码了。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 慕沐8221787 #1
    关闭代码re.close()和rs=null都在if(rs!=null)里面,为什么已执行关闭了,还要来个rs=null,我问的是这个意思,请对这个疑问做一解释。
    2019-11-02 15:16:36
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java数据库开发与实战应用2018版
  • 参与学习           人
  • 提交作业       277    份
  • 解答问题       4297    个

Java数据库开发的必备技能,从流行的MySQL数据库开始,到Java原生的数据库管理接口JDBC的使用,再到常用的数据持久化框架MyBatis,让你向Java工程师的目标又迈进了一步!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师