问题来自于一次事故(新手轻喷),如不想看可直接跳至方法
故事(事故)如下
刚刚接触MVC架构,视频刷的飞起,然后,(脑子:我已经会了!!!)(手:不,你不会)
Dao层与Util包都构建好后,开始写Service层,在激动的调试中(改bug中),nice,程序正常结束(插入一些数据)
结果,数据库莫得任何反应(整得我以为又是哪个精神小伙没有好好接上通道还给我偷偷关上了)然而眼球编译器不起作用后,只能好好一步步看debug
然后,重点来了!!!
运行时ResultSet(以下简写rs)不等于null,但本来应该是判断为空(后来才知道这里的问题),而且后面while(rs.next())直接跳过也证明结果集就是空的
所以相当于什么都没执行,当然直接return true了
//这里传入了一本书的信息
public boolean newBook(String isbn, String type, int price, String auth, String bName) throws Exception {
rs = tBookDao.select("bName",bName);
if(rs==null){ //错误的根源
tBookDao.insert(isbn,type,price,auth,bName);
}else{
while(rs.next()){
if(!(rs.getString("isbn").equals(isbn))){
flag = tBookDao.update("isbn",isbn,rs.getInt("price"),bName);
if(!flag) return false;
}
if(!(rs.getString("type").equals(type))){
flag = tBookDao.update("type",isbn,rs.getInt("price"),bName);
if(!flag) return false;
}
if(!(rs.getInt("price")==price)){
flag = tBookDao.update("bName",bName,price,bName); ////
if(!flag) return false;
}
if(!(rs.getString("auth").equals(auth))){
flag = tBookDao.update("auth",auth,rs.getInt("price"),bName);
if(!flag) return false;
}
}
}
return true;
}
然后我也是看了别人的博客才明白
问题与方法
问题
错误出在判断结果集为空时使用了if(rs==null)
但实际上rs是有一个对象的,只不过对象中的值或为null或为false
解决方法
如果需要判断的话,用if(rs.next())或者是if(rs.first())
前者是判断rs是否有值,没有时返回false;后者是判断rs指针是否指在第一条,如果为空时返回false。
因为rs初始化时是指在第一条的,而我们在调用next(),first()等方法后,它就会指向第二条,所以在做完判断后,我们需要给指针前移一位,用previous()方法。
例子如下
if(rs.first()){
//当结果集存在时
//xxx
rest.previous();
}
while(rs.next()){
//遍历结果集
}
本文讲述了在Java中处理ResultSet时遇到的一个常见问题,即在判断结果集是否为空时误用`if(rs==null)`导致实际结果为空时未被正确识别。作者通过自己的学习和调试经验,指出应该使用`if(rs.next())`或`if(rs.first())`来正确判断结果集是否有数据。同时,还提供了在使用这些方法后恢复指针位置的方法。

2727

被折叠的 条评论
为什么被折叠?



