为啥没有结果时 ResultSet 不为空? [复制]

Posted

技术标签:

【中文标题】为啥没有结果时 ResultSet 不为空? [复制]【英文标题】:Why isn't the ResultSet null when there are no results? [duplicate]为什么没有结果时 ResultSet 不为空? [复制] 【发布时间】:2017-06-20 09:15:29 【问题描述】:

为什么我的 else 不起作用?没有输出。我的 if 工作得很好。帮助表示赞赏!

String s2 = "SELECT CCA FROM generatedchoices WHERE category='" + category + "' AND intensiveness='"+ intensiveness + "'";
        rs2 = st.executeQuery(s2);

        if(rs2!=null)
            while (rs2.next()) 
                ccalist.add(rs2.getString("CCA"));
            
        
        else
            System.out.println("No combination!");
            //JOptionPane.showMessageDialog(null, "No combination found!");
        

【问题讨论】:

如果if 块“运行良好”,为什么还要输入else 块? 如果没有获取记录,rs2 不会为空。 rs2.next() 将是错误的 如果您的if 块工作正常,为什么else 块可以工作? 【参考方案1】:

你在做

rs2 = st.executeQuery(s2);

所以rs2 永远不会为空。

也许你想要什么 ti if (rs2.isBeforeFirst()) ... else ...

见http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#isBeforeFirst()

【讨论】:

【参考方案2】:

来自the docs for Statement#executeQuery(强调我的):

返回:一个 ResultSet 对象,其中包含给定查询产生的数据; 从不为空

如果查询没有返回任何行,您将不会得到null。你会得到一个空的ResultSet。一个简单的检查方法是使用isBeforeFirst() 作为给定的in this answer,而不是检查null

if (resultSet.isBeforeFirst() )     
    // loop over results
 else 
    // no results returned
 

如果您对该解决方案不满意,或者由于某种原因它会给您带来问题,另一种直接的方法是简单地检查您是否处理了结果,例如:

rs2 = st.executeQuery(s2);

boolean hadResults = false;

while (rs2.next()) 
    ccalist.add(rs2.getString("CCA"));
    hadResults = true;


if (!hadResults) 
    System.out.println("No combination!");
    //JOptionPane.showMessageDialog(null, "No combination found!");

或者你可以想出的任何其他方法来剥那只特定的猫。

【讨论】:

点赞测试length of ccalist @ScaryWombat 这也行得通,尽管在此代码 sn-p 之前,您必须小心不要对 ccalist 的内容做出任何假设。在给出 [缺少] 信息的情况下,您需要比较循环前后的大小。这也意味着ccalist实际上是某种列表的假设,并且add总是增加大小,而不是一个容易混淆的变量,例如某种类型的集合。但如果您对ccalist 了解更多,您可以稍微缩小选择范围。

以上是关于为啥没有结果时 ResultSet 不为空? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在MyEclipse中执行模糊查询,ResultSet结果集不为空但rs.next()为false,求解。

jdbc如何判断记录集是否为空?用啥方法?ResultSet本身是否根本就没有这样的方法?

hibernate多表联合查询返回的list没有数据,但list.isEmpty()判断为啥不为真

当堆栈仍然有元素时,为啥会跳过“如果堆栈不为空”条件?

scala - 为啥map.size在地图不为空时返回0

在查询SQL语句中为空或不为空怎么写