while (rs.next()) 的问题!!一个经常遇到但却被人忽略的问题!! 这样会报NullPointerException 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不太明白你是需要判断这个结果集是否为空(即无任何记录)吗?如果是,你可以if(rs.next()) { do { }while(rs.next());} else {Empty ResultSet}不过一般使用中并不一定需要上面的这种判断,还是直接while(rs.next())多 if(rs.next()) {do {}while(rs.next());} else {Empty ResultSet}这样是不行的!这样取不到第一条记录 public void run() { /** 读取数据库** */ DbTestConn conn = new DbTestConn(); String sql = "select * from mo_info where mo_state = '1'"; ResultSet rs = conn.exeQuery(sql); try { while (rs.next()) { tr.setId(rs.getInt(1)); tr.setUser(rs.getString(2)); tr.setPwd(rs.getString(3)); isNull = false; } } catch (SQLException e) { isNull = true; e.printStackTrace(); } }把那个if去掉,如果rs是空的,循环自然是不会进行的了。 像楼上那样就行了,这是ResultSet比较典型的读取方式。 public void run() { /** 读取数据库** */ DbTestConn conn = new DbTestConn(); String sql = "select * from mo_info where mo_state = '1'"; ResultSet rs = conn.exeQuery(sql); try { if(rs.next()) { do{ tr.setId(rs.getInt(1)); tr.setUser(rs.getString(2)); tr.setPwd(rs.getString(3)); isNull = false; }while(rs.next()) } } catch (SQLException e) { isNull = true; e.printStackTrace(); } } public void run() { /** 读取数据库** */ DbTestConn conn = new DbTestConn(); String sql = "select * from mo_info where mo_state = '1'"; try {//范围扩大,万一查询错误呢 ResultSet rs = conn.exeQuery(sql); if(rs!=null){//判断是不是空 while (rs.next()) { tr.setId(rs.getInt(1)); tr.setUser(rs.getString(2)); tr.setPwd(rs.getString(3)); } } catch (Exception e) {//不对异常处理,不用特别捕捉阿 e.printStackTrace(); } } } public void run() { /** 读取数据库** */ DbTestConn conn = new DbTestConn(); String sql = "select * from mo_info where mo_state = '1'"; ResultSet rs = conn.exeQuery(sql); try { while (rs.next()) { tr.setId(rs.getInt(1)); tr.setUser(rs.getString(2)); tr.setPwd(rs.getString(3)); isNull = false; } } catch (SQLException e) { isNull = true; e.printStackTrace(); } } 好像简单的事情搞复杂了,首先明确几点:1、rs = stmt.exeQuery(sql)后,rs肯定不会为null,注意,是rs对象不会为null,而不是其包含的result2、既然rs不会为null,所以在rs = stmt.exeQuery(sql)后,使用while(rs.next())或者if(rs.next())时就不用判断rs != null;3、rs.next时,游标最先是指向第一条记录前的位置,所以第一次rs.next后,游标指向的正好是第一条记录(如果有的话)4、要判断rs的结果是否为空,只要使用一次rs.next方法就行了,如果它返回为null,则证明rs的结果为null所以最终的代码可以写为: public void run() { /** 读取数据库** */ DbTestConn conn = new DbTestConn(); String sql = "select * from mo_info where mo_state = '1'"; ResultSet rs = conn.exeQuery(sql); //while (!isNull) { try { while (rs.next()) { tr.setId(rs.getInt(1)); tr.setUser(rs.getString(2)); tr.setPwd(rs.getString(3)); //isNull = false; } } catch (SQLException e) { //isNull = true; e.printStackTrace(); } //} } sorry,修正一下:4、要判断rs的结果是否为空,只要使用一次rs.next方法就行了,如果它返回为false,则证明rs的结果为null if(rs.next()) { do { System.out.println(rs.getString(1)); }while(rs.next());} else {Empty ResultSet}这种方法当然可以取得第一行!因为我在调用了第一次rs.next()之后马上进入do循环,这个时候rs.getString(1)取得的就是第一行记录!!!!!!!!这个是判断记录集是不是空的一个好方法!!! if(rs.next()) { do { System.out.println(rs.getString(1)); }while(rs.next());} else {Empty ResultSet}是个不错的方法不过常用的方法是try{while(rs.next()){System.out.print(rs.getString(1));}}catch(SQLException SQLE){e.printStackTrace();}楼主的isNULL好象没什么用,因为当rs为空时,rs.next()就会返回flase 我上面也说了最常用的是while(rs.next()){System.out.print(rs.getString(1));}主要是因为有些时候在记录集一条记录都没有的时候需要做一些额外的提示(可能弹出一个窗口说没有找到任何记录的样子)的话,我那种方法写起来比较简洁一些 你是画蛇添足呀,用一个while就可以了 当然不是完全是多余的,我都说了最常用的当然是只需要一个while,但是有些时候如果结果集是空白的,可能需要提示用户没有结果,如:if(rs.next()) { do { out.println("Name:" + rs.getString(1)); }while(rs.next());} else { out.println("没有找到匹配的用户");}如果你直接使用while循环就不容易完成,你还需要增加一个变量来看看是不是有记录所以这种方式不是经常用到,但是在某些时候还是有用的 楼住把catch里的 isNull = true;提到try上就可以了不用改很多 楼上的弟兄已经说了,有一个while(rs.next())就可以了,用isNull是多此一举 对不去,我出差刚回来 :)我这里想实现的是一个共享资源模型!!就是一个线程负责向共享资源里放置数据;另一个线程则同步地读取共享资源里的数据!!上面的只是把数据放到共享资源里了,而当另一个线程读取时则需要判断一下共享资源里是否有数据!!所以还是要用到一个参数的(此处是isNull),请问大家该怎么做???非常感谢!!! 非对称解密时报错,求解! 父类可以调用子类的重写的方法吗?父类方法被多个子类重写的情况? 构造方法的初始化问题(重载与不重载有区别吗) 一个技术积极讨论专区 struts编译bean的问题 接收对方Get方式发送的数据,然后返回报文应该怎样做 hibernate UnresolvableObjectException tomcat 虚拟主机配置问题 这些代码由问题么? 请问在WEBLOGIC中怎样为局域网上的ORACLE配置一个连接池??请高手指点!! java怎么取到毫秒级别的时间 分页,如何一次取到所有数据,并分页
你是需要判断这个结果集是否为空(即无任何记录)吗?如果是,你可以
if(rs.next()) {
do {
}while(rs.next());
} else {
Empty ResultSet
}
不过一般使用中并不一定需要上面的这种判断,还是直接while(rs.next())多
do {
}while(rs.next());
} else {
Empty ResultSet
}这样是不行的!这样取不到第一条记录
/** 读取数据库** */
DbTestConn conn = new DbTestConn();
String sql = "select * from mo_info where mo_state = '1'";
ResultSet rs = conn.exeQuery(sql);
try {
while (rs.next()) {
tr.setId(rs.getInt(1));
tr.setUser(rs.getString(2));
tr.setPwd(rs.getString(3));
isNull = false;
}
} catch (SQLException e) {
isNull = true;
e.printStackTrace();
}
}
把那个if去掉,如果rs是空的,循环自然是不会进行的了。
/** 读取数据库** */
DbTestConn conn = new DbTestConn();
String sql = "select * from mo_info where mo_state = '1'";
ResultSet rs = conn.exeQuery(sql);
try {
if(rs.next()) {
do{
tr.setId(rs.getInt(1));
tr.setUser(rs.getString(2));
tr.setPwd(rs.getString(3));
isNull = false;
}while(rs.next())
}
} catch (SQLException e) {
isNull = true;
e.printStackTrace();
}
}
/** 读取数据库** */
DbTestConn conn = new DbTestConn();
String sql = "select * from mo_info where mo_state = '1'";
try {//范围扩大,万一查询错误呢
ResultSet rs = conn.exeQuery(sql);
if(rs!=null){//判断是不是空
while (rs.next()) {
tr.setId(rs.getInt(1));
tr.setUser(rs.getString(2));
tr.setPwd(rs.getString(3));
}
} catch (Exception e) {//不对异常处理,不用特别捕捉阿
e.printStackTrace();
}
}
}
/** 读取数据库** */
DbTestConn conn = new DbTestConn();
String sql = "select * from mo_info where mo_state = '1'";
ResultSet rs = conn.exeQuery(sql);
try {
while (rs.next()) {
tr.setId(rs.getInt(1));
tr.setUser(rs.getString(2));
tr.setPwd(rs.getString(3));
isNull = false;
}
} catch (SQLException e) {
isNull = true;
e.printStackTrace();
}
}
1、rs = stmt.exeQuery(sql)后,rs肯定不会为null,注意,是rs对象不会为null,而不是其包含的result
2、既然rs不会为null,所以在rs = stmt.exeQuery(sql)后,使用while(rs.next())或者if(rs.next())时就不用判断rs != null;
3、rs.next时,游标最先是指向第一条记录前的位置,所以第一次rs.next后,游标指向的正好是第一条记录(如果有的话)
4、要判断rs的结果是否为空,只要使用一次rs.next方法就行了,如果它返回为null,则证明rs的结果为null
所以最终的代码可以写为:
public void run() {
/** 读取数据库** */
DbTestConn conn = new DbTestConn();
String sql = "select * from mo_info where mo_state = '1'";
ResultSet rs = conn.exeQuery(sql);
//while (!isNull) {
try {
while (rs.next()) {
tr.setId(rs.getInt(1));
tr.setUser(rs.getString(2));
tr.setPwd(rs.getString(3));
//isNull = false;
}
} catch (SQLException e) {
//isNull = true;
e.printStackTrace();
}
//}
}
4、要判断rs的结果是否为空,只要使用一次rs.next方法就行了,如果它返回为false,则证明rs的结果为null
do {
System.out.println(rs.getString(1));
}while(rs.next());
} else {
Empty ResultSet
}
这种方法当然可以取得第一行!
因为我在调用了第一次rs.next()之后马上进入do循环,这个时候rs.getString(1)取得的就是第一行记录!!!!!!!!
这个是判断记录集是不是空的一个好方法!!!
do {
System.out.println(rs.getString(1));
}while(rs.next());
} else {
Empty ResultSet
}
是个不错的方法
不过常用的方法是
try{
while(rs.next()){
System.out.print(rs.getString(1));
}
}
catch(SQLException SQLE)
{e.printStackTrace();}
楼主的isNULL好象没什么用,因为当rs为空时,rs.next()就会返回flase
while(rs.next()){
System.out.print(rs.getString(1));
}主要是因为有些时候在记录集一条记录都没有的时候需要做一些额外的提示(可能弹出一个窗口说没有找到任何记录的样子)的话,我那种方法写起来比较简洁一些
if(rs.next()) {
do {
out.println("Name:" + rs.getString(1));
}while(rs.next());
} else {
out.println("没有找到匹配的用户");
}如果你直接使用while循环就不容易完成,你还需要增加一个变量来看看是不是有记录所以这种方式不是经常用到,但是在某些时候还是有用的
我这里想实现的是一个共享资源模型!!
就是一个线程负责向共享资源里放置数据;另一个线程则同步地读取共享资源里的数据!!
上面的只是把数据放到共享资源里了,而当另一个线程读取时则需要判断一下共享资源里是否有数据!!
所以还是要用到一个参数的(此处是isNull),请问大家该怎么做???非常感谢!!!