提问者:小点点

从try/catch块内部返回逻辑


public String returnFirstName() throws SQLException {
    String Username = username.getText();
    String Password = String.valueOf(password.getPassword());
    connection = DriverManager.getConnection(jdbcURL, user, SQLPassword);
    statement = connection.createStatement();
    try {
        resultSet = statement.executeQuery("SELECT * FROM users WHERE username="
                + "'" + Username + "'" + " AND password=" +
                "'" + Password + "'" + ";");
        FirstName = resultSet.getString("first_name");
    } catch (Exception exception) {
        error = true;
        exception.printStackTrace();
    } finally {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
        if (error) System.out.println("Error");
    }
    return FirstName;
}

您好,所以我遇到了一个问题,我试图返回从数据库中获取的值,但firstname的值为空,try块中的语句无效。是否有任何方法返回值,逻辑在try块中。(firstname变量已声明)有人能帮我吗?提前感谢!


共2个答案

匿名用户

如果first_name列存在,resultSet.getString()将不会引发NullPointerException。

对此,一个可能的解决方案是:

FirstName = resultSet.getString("first_name");
if (FirstName == null) {
        throw new NullPointerException();
}

我还强烈建议更改您编写查询的方式。使用准备好的语句,因为当前的方法使您的数据库容易受到注入攻击。

准备好的语句是通过绑定变量为用户输入提供占位符的SQL语句。当执行该语句时,将单独提供用户输入,以确保数据库不会被诱骗以代码形式执行用户输入。

这是您查询的部分实现,其余的我将留给您弄清楚:

PreparedStatement preparedStatement = connection.prepareStatement(
"SELECT * FROM users WHERE username=?");
prep.setString(1, Username);
return preparedStatement.executeQuery();

匿名用户

处理数据库错误的正确方法是…根本不捕捉它。

请注意这一行的最后两个关键字:

public String returnFirstName() throws SQLException {

抛出SQLException部分意味着您不必在代码中捕获任何异常。throws子句告诉任何调用代码,如果数据库检索因任何原因失败,它必须决定要做什么。这是一件好事。这就是应用程序的编写方式。

这也意味着您不需要catch块。事实上,如果您将连接和语句放在try-with-资源语句中,您也可以删除最后块:

public String returnFirstName() throws SQLException {
    String Username = username.getText();
    String Password = String.valueOf(password.getPassword());

    try (Connection connection = DriverManager.getConnection(jdbcURL, user, SQLPassword);
         Statement statement = connection.createStatement()) {


        ResultSet resultSet = statement.executeQuery("SELECT * FROM users WHERE username="
                + "'" + Username + "'" + " AND password=" +
                "'" + Password + "'" + ";");
        return resultSet.getString("first_name");
    }
}

通过在<code>try</code>之后的括号内声明Connection和Statement对象,我们告诉Java在<code<try<-code>块结束时自动关闭它们。如果代码成功完成,或者发生异常,都会发生这种情况。(当相应的语句关闭时,ResultSet将自动关闭。)

与其试图忽略异常并为firstName选择一些“特殊”值,不如让调用代码决定在无法检索到值时要做什么。这允许您的方法每次都可靠地返回一个有效值。如果发生错误,该方法根本不会返回;相反,它将传播底层SQLException。调用方法的代码可以确定,如果返回了值,则该值是有效值。

(我故意不在这里讨论安全问题,例如SQL注入和未加密密码,因为这似乎是一项任务或练习,安全问题将超出范围。)