当set为null时,为什么set1变为null?

时间:2013-02-08 18:17:53

标签: java database jdbc

在以下代码段中,我执行查询并将结果集传递给set。然后set被分配到set1。之后会有一个while循环,直到set.next返回false。如果set.next在循环后返回false,set1也会返回false吗?

ResultSet set = statement.executeQuery();
ResultSet set1 = set;
while (set.next()) {
    if (set.getString(1).equalsIgnoreCase(keyword)) { 
        // If the search matches the exact keyword
        list.put(set.getString(2), set.getString(1));
        // Where key is the name of the node and value is, name of the file
    }
}

我问这个是因为:

while (set1.next()) {
    System.out.println("@@@Inside the while statement@@@");
    if (set1.getString(1).contains(keyword) 
    && set1.getString(1).compareToIgnoreCase(keyword) !=0) { 
        // If the search contains the keyword but does not exactly match
        list.put(set.getString(2), set.getString(1));
        // Where key is the name of the node and value is, name of the file
        System.out.println("@@@Inside the if statement of second while loop !@@@");
    }
}

这个while结构永远不会起作用。这是什么原因?如果是这样,我该怎么办?

4 个答案:

答案 0 :(得分:1)

你有两个主要的错误:

  1. set分配给set1不会复制 - 这是同一套
  2. String.contains() 区分大小写(您的代码与您的评论不符)
  3. 修复方法是:

    1. 不要使用两个循环 - 只使用一个循环
    2. `toLowerCase()contains()一起使用以实现“不区分大小写的包含”测试
    3. 另外,如果你的第一次测试是真的,你的第二次测试也是如此,所以你不需要两个测试/循环
    4. 试试这段代码:

         ResultSet set = statement.executeQuery();
         while(set.next()) {
             if(set.getString(1).toLowerCase()
                    .contains(keyword.toLowerCase)) {
                 list.put(set.getString(2), set.getString(1));
             }
         }
      

      此外,不要将地图称为“列表” - 将其称为“地图”,否则只会让读者感到困惑。

答案 1 :(得分:0)

你可以尝试这样做。

   ResultSet set1 = statement.executeQuery();

答案 2 :(得分:0)

set1是对set指向的同一对象的引用。如果你想再次遍历ResultSet,你需要使用类似的东西再次将迭代器光标移动到开头:

set.beforeFirst();

在Java中,为对象分配变量不会创建对象的副本,它只引用内存中的对象。如果您希望setset1独立工作,则必须明确制作该对象的副本。

在你的特定用例中,我认为这不是你想要的,只是移动迭代光标似乎更好。

答案 3 :(得分:0)

  

如果set.next在循环后返回false,那么set1也是如此   返回false?

即可。因为set1指的是Resultset所指的set的同一个对象。因此ResultSet引用的set对象所展示的任何行为也会由set1反映。在您的第一个while循环中,ResultSet引用的set对象迭代到所有记录后(使用set.next())完全耗尽。此后,无论哪个变量(set或set1)尝试阅读更多变量,都会.next()false

如果在你的第一个while循环结构中,我使用.next()变量检查set并使用set1变量获得结果它仍然有效。 尝试使用此代码而不是第一个构造,您将看到输出与第一个构造中的内容相同:

ResultSet set = statement.executeQuery();
       ResultSet set1 = set;
       while(set.next()) {
           if(set1.getString(1).equalsIgnoreCase(keyword)) { // If the search matches the exact keyword
               list.put(set1.getString(2), set1.getString(1));
               // Where key is the name of the node and value is, name of the file
           }
       }

如果您仍希望set1返回结果,则应使用以下方法重建新的ResultSet对象:

set1 = stat.executeQuery()

其中,stat是您在代码中使用的Statement/PreparedStatement