一个JDBC的小问题

timothylee2005 2010-10-01 07:14:10

rs.close();
rs=null;

请问rs都已经close了,再rs=null还有意义吗?具体是什么意义?
close方法中不是已经将它置为null了吗?

stmt 和 conn 也是同样的问题.

谢谢!
...全文
150 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zuomingyu2 2010-10-02
  • 打赏
  • 举报
回复
没必要的吧~·····
zhang_zi_han 2010-10-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 happysmhzp 的回复:]
rs.close();只表示关闭了资源,但不能保证对象不为null,rs=null这样可以快垃圾回收器对他的回收
[/Quote]

多此一举
sound9world 2010-10-02
  • 打赏
  • 举报
回复
有些人认为设置为null可以防止关闭两次,关闭两次会有异常 见过那种写法

其实关闭两次就是编码有问题了,有问题报错是应该的,置成null也也有个异常么。。

SQLException换成NullPointerException 没看出什么意义。
  • 打赏
  • 举报
回复
多此一举
timothylee2005 2010-10-02
  • 打赏
  • 举报
回复
经测试,连续关闭两次并未报错:

rs.close();
rs.close();

但先赋为null之后再调用close,就会报NullPointerException:
rs.close();
rs=null;
rs.close(); //此行报NullPointerException
谢谢大家!
aa870816 2010-10-02
  • 打赏
  • 举报
回复
这个问题没必要深究~~
WoodLikeWater 2010-10-01
  • 打赏
  • 举报
回复
还有Connection的单例生产模式,关闭的时候不赋值成null 也会出问题的。



//DaoBase 类
private Connection conn;
public static Connection getInstance(){
if(this.conn == null){
this.conn = DriverManager.getConn(....);
}
return this.conn ;
}
public static void closeConn(boolean flag){
if(conn != null){
conn.close();
if(flag){
conn = null;
}
}
}
......
//当前类

public int static upadate(Connection conn,String sql){
...........
}

public static void main(String args[]){
Connection conn =DaoBase.getInstance();
this.update(conn,sql);//执行一条更新语句方法
DaoBase.closeConn(false);//关闭没有设置成null
//DaoBase.closeConn(true); 用这句代替上一句 后面都不会报错

conn = DaoBase.getInstance();
conn.update(conn,sql); //报conn已经关闭 不能再用 类似的错误

}





如果之前有DaoBase
lxy15329 2010-10-01
  • 打赏
  • 举报
回复
学习一下了
WoodLikeWater 2010-10-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 timothylee2005 的回复:]
if(rs != null)
{
rs.close();
rs=null;
}

问题是在if内部也有 rs=null; 呀,我看一个很权威的老师(马士兵)是这么用的.
[/Quote]
一个数据库访问类的封住,可能会把conn、pstmt、rs写成全局变量
所以可能多个方法会用到 conn 、 pstmt 、rs
我觉的有必要这样写的,印象中conn如果已经关闭 conn不赋值为null的话
再调用close()方法 会报错,我想rs如果关闭了,再调用关闭方法应该也会报错。
没编译器没法给你测试。。

rs.close();
rs.close();

连续调用两次看下能报错不?
能报错就说明有必要这么写。
closewbq 2010-10-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 timothylee2005 的回复:]
if(rs != null)
{
rs.close();
rs=null;
}

问题是在if内部也有 rs=null; 呀,我看一个很权威的老师(马士兵)是这么用的.
[/Quote]

其实他这样做也没什么必要。rs=null。目的是为了让垃圾回收。但是垃圾回收机制不是你设置为null就会回收的。jvm有专门的线程会检测内存空间,当内存空间不够的时候,才会进行垃圾回收。
avajevoli 2010-10-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 timothylee2005 的回复:]
if(rs != null)
{
rs.close();
rs=null;
}

问题是在if内部也有 rs=null; 呀,我看一个很权威的老师(马士兵)是这么用的.
[/Quote]

rs=null,将rs的值赋值为空。
happysmhzp 2010-10-01
  • 打赏
  • 举报
回复
rs.close();只表示关闭了资源,但不能保证对象不为null,rs=null这样可以快垃圾回收器对他的回收
timothylee2005 2010-10-01
  • 打赏
  • 举报
回复
if(rs != null)
{
rs.close();
rs=null;
}

问题是在if内部也有 rs=null; 呀,我看一个很权威的老师(马士兵)是这么用的.
lee_wanjer 2010-10-01
  • 打赏
  • 举报
回复
应该 是这样写的吧

if(rs != null)
rs.close();

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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