Java会跳过其他条件

时间:2010-02-16 22:33:05

标签: java jdbc

我不确定原因,但由于某种原因,以下代码会跳过else条件。我已经尝试过我能想到的一切,包括切换代码块,但它仍然会跳过else部分。基本上,如果在String temp = "no"数据库中找不到传递给方法的String docID,我希望此方法返回FILESTATUS,如果找到则String temp = "yes"

static String checkDocID(String docID)
{
    String temp = null;

    System.out.println("Checking if data already exists in database...");
    try
    {
        Main.stmt = Main.con.createStatement();
        String command = "SELECT * FROM FILESTATUS WHERE ID='" + docID + "'";
        ResultSet queryResult = Main.stmt.executeQuery(command);
        if (!queryResult.next())
        {
            temp = "no";
        }
        else
        {
            while (queryResult.next())
            {
                String result = queryResult.getString("ID");
                if (result.equals(docID))
                {
                    temp = "yes";
                    break;
                }
            }
        }
        Main.stmt.close();
    }
    catch (Exception ex) {ex.printStackTrace();}
    return temp;
}

谢谢!

5 个答案:

答案 0 :(得分:16)

因为您最终在“if”中再次调用queryResult.next()并再次在while中调用,所以您将跳过第一个结果。如果只有一个结果,则while循环将永远不会执行。

如果我可以提出一些建议:

  • 在PreparedStatement中使用绑定变量,而不是在查询字符串中放入“docID”
  • 不要测试result.equals(docID),因为查询已经确定了。
  • 首选布尔值为字符串“是”或“否”
  • 将结果设置为“no”或false,然后在循环中将其设置为“yes”或true。额外的分配可能比额外的测试更快,而且你可以跳过do {},而大多数人会觉得难以阅读。

答案 1 :(得分:6)

最好将此循环重构为:

static String checkDocId(String docId) {
    String temp = "no";

    while (queryResult.next()) {                
        String result = queryResult.getString("ID");

        if (result.equals(docID)) {
            temp = "yes";
            break;
        }
    }

    return temp;
}

有些人不喜欢使用break(我通常不喜欢),所以你可以在你的while中使用布尔值(我发现它更像是英语,你可以直接告诉终止条件while而不是在内部寻找if

static String checkDocId(String docId) {
    boolean found = false;

    while (queryResult.next() && !found) {
        String result = queryResult.getString("ID");
        found = result.equals(docID);
    }

    return found ? "yes" : "no";
}

否则你正在进行不必要的比较。请注意,while只是if,最后有goto;)

就你的问题而言,保罗说的是正确的。无论如何,我仍然会重新构造循环,以使它更优雅。

答案 2 :(得分:3)

在对代码感到有点惊讶之后(泄漏数据库资源,不信任数据库,它返回正确的docID,在不需要所有列的情况下执行SELECT *,没有利用PreparedStatement的SQL注入清理功能,使用String而不是boolean来表示真/假值,一个混乱的代码流,这是它应该如何真的代替:

private static final String SQL_EXIST_DOCID = 
    "SELECT id FROM filestatus WHERE id = ?";

public boolean exist(String docID) throws SQLException {
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet resultSet = null;
    boolean exist = false;

    try {
        connection = database.getConnection();
        statement = connection.prepareStatement(SQL_EXIST_DOCID);
        statement.setString(1, docID); // Shouldn't it be a Long instead? Characterbased PK's are *far* from efficient.
        resultSet = statement.executeQuery();
        exist = resultSet.next();
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
        if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
        if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
    }

    return exist;
}

清晰,简洁和简单。有关使用基本JDBC 的更多见解,您可能会发现this article有用。我希望你认真学习它。真。

答案 3 :(得分:1)

rs.next()在每次调用后滚动当前光标

尝试

static String checkDocID(String docID)
{
    String temp = null;

    System.out.println("Checking if data already exists in database...");
    try
    {
        Main.stmt = Main.con.createStatement();
        String command = "SELECT * FROM FILESTATUS WHERE ID='" + docID + "'";
        ResultSet queryResult = Main.stmt.executeQuery(command);
        boolean found = queryResult.next();
        if (!found)
        {
            temp = "no";
        }
        else
        {
            do {
                String result = queryResult.getString("ID");
                if (result.equals(docID))
                {
                    temp = "yes";
                    break;
                }
            } while (queryResult.next())
        }
        Main.stmt.close();
    }
    catch (Exception ex) {ex.printStackTrace();}
    return temp;
}

答案 4 :(得分:1)

在尝试阅读之前,您正在调用queryResult.next两次。为了证明这一点,请在其他地方之前(之前)放一个println或其他东西。

由于您是按特定ID选择的,因此移动到next()两次实际上会失败第二次(可能)并且永远不会执行while块。