一个JDBC的小问题 rs.close();rs=null;请问rs都已经close了,再rs=null还有意义吗?具体是什么意义?close方法中不是已经将它置为null了吗?stmt 和 conn 也是同样的问题.谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 应该 是这样写的吧 if(rs != null) rs.close(); if(rs != null){ rs.close(); rs=null;}问题是在if内部也有 rs=null; 呀,我看一个很权威的老师(马士兵)是这么用的. rs.close();只表示关闭了资源,但不能保证对象不为null,rs=null这样可以快垃圾回收器对他的回收 rs=null,将rs的值赋值为空。 其实他这样做也没什么必要。rs=null。目的是为了让垃圾回收。但是垃圾回收机制不是你设置为null就会回收的。jvm有专门的线程会检测内存空间,当内存空间不够的时候,才会进行垃圾回收。 一个数据库访问类的封住,可能会把conn、pstmt、rs写成全局变量所以可能多个方法会用到 conn 、 pstmt 、rs我觉的有必要这样写的,印象中conn如果已经关闭 conn不赋值为null的话再调用close()方法 会报错,我想rs如果关闭了,再调用关闭方法应该也会报错。没编译器没法给你测试。。 rs.close();rs.close();连续调用两次看下能报错不?能报错就说明有必要这么写。 还有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 有些人认为设置为null可以防止关闭两次,关闭两次会有异常 见过那种写法 其实关闭两次就是编码有问题了,有问题报错是应该的,置成null也也有个异常么。。 SQLException换成NullPointerException 没看出什么意义。 经测试,连续关闭两次并未报错:rs.close();rs.close();但先赋为null之后再调用close,就会报NullPointerException:rs.close();rs=null;rs.close(); //此行报NullPointerException谢谢大家! 求助高手,Oracle获取当前时间的问题 大家帮我看下这个关于Java的句子是什么意思 ant 运行wsgen找不到相应的运行环境 webservice设置soap头的问题。。。谢谢了。。 Java多线程面试题求开解 ejb怎么部署到glassfish? HttpServletResponse response 日文转换问题! 请教个关于系统日期的问题 为什么我得分的时候,我的可用分不增加呀,只是每天增加10分??谢谢了! Glassfish4.1怎么启用SSI 调查一下,你使用的第一个数据库是什么?Access也算哦. jbpm4和ssh一起用出现的问题
rs.close();
{
rs.close();
rs=null;
}问题是在if内部也有 rs=null; 呀,我看一个很权威的老师(马士兵)是这么用的.
rs=null,将rs的值赋值为空。
其实他这样做也没什么必要。rs=null。目的是为了让垃圾回收。但是垃圾回收机制不是你设置为null就会回收的。jvm有专门的线程会检测内存空间,当内存空间不够的时候,才会进行垃圾回收。
所以可能多个方法会用到 conn 、 pstmt 、rs
我觉的有必要这样写的,印象中conn如果已经关闭 conn不赋值为null的话
再调用close()方法 会报错,我想rs如果关闭了,再调用关闭方法应该也会报错。
没编译器没法给你测试。。 rs.close();
rs.close();连续调用两次看下能报错不?
能报错就说明有必要这么写。
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
rs.close();但先赋为null之后再调用close,就会报NullPointerException:
rs.close();
rs=null;
rs.close(); //此行报NullPointerException
谢谢大家!