繁体   English   中英

ResultSet 可能为空,如何解决?

[英]ResultSet could be possibly null, how to fix this?

它告诉我“userRow”ResultSet 可能为空,你们知道我该如何解决这个问题或为什么会发生这种情况,我将不胜感激,谢谢。

它告诉我添加更多细节:我创建了这个 ResultSet 方法,以便从我用 MySQL Workbench 创建的 MySQL 数据库中检索信息,我试图检索 USER_TABLE、用户名和密码的信息,所以它会得到来自这两列的信息,然后检查数据库并允许登录。 但它一直给我一个异常,即 ResultSet 可能为空,我还在代码中指出了错误的具体位置。

任何形式的帮助表示赞赏。

谢谢。

这是我与该问题相关的两个类:

public class Login {

@FXML
private TextField userNameTextField;

@FXML
private PasswordField passwordPasswordField;

@FXML
private Button signUpButton;

@FXML
private Button loginButton;

private sample.database.dbHandler dbHandler;

@FXML
void initialize() {

    dbHandler = new dbHandler();


    loginButton.setOnAction(event -> {

        String loginText = userNameTextField.getText().trim();
        String loginPassword = passwordPasswordField.getText().trim();

        User user = new User();
        user.setUsername(loginText);
        user.setPassword(loginPassword);

        ResultSet userRow = dbHandler.getUser(user);

        int counter = 0;

        try {

            while (userRow.next()) { //it says that "userRow" could possibly be null

                counter++;

            }

            if (counter == 1) {

                System.out.println("Logged in");

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

    });

    signUpButton.setOnAction(event -> {

        signUpButton.getScene().getWindow().hide();

        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("/sample/signup.fxml"));

        try {

            loader.load();

        } catch (IOException e) {

            e.printStackTrace();

        }

        Parent root = loader.getRoot();
        Stage stage = new Stage();
        stage.setScene(new Scene(root));
        stage.showAndWait();

    });

}

public class dbHandler extends Config {

java.sql.Connection Connection;

public Connection getConnection() throws ClassNotFoundException, SQLException {

    String connectionString = "jdbc:mysql://" + dbHost + ":" + dbPort + "/" + dbName;

    Class.forName("com.mysql.cj.jdbc.Driver");

    Connection = DriverManager.getConnection(connectionString, dbUser, dbPass);

    return Connection;

}

public void signUp(User user) {

    String insert = "INSERT INTO " + Constants.USERS_TABLE + "(" + Constants.USERS_FIRSTNAME + "," + Constants.USERS_LASTNAME + "," +
            Constants.USERS_USERNAME + "," + Constants.USERS_PASSWORD + ")" + "VALUES(?,?,?,?)";

    try {

        PreparedStatement preparedStatement = getConnection().prepareStatement(insert);

        preparedStatement.setString(1, user.getFirstName());
        preparedStatement.setString(2, user.getLastName());
        preparedStatement.setString(3, user.getUsername());
        preparedStatement.setString(4, user.getPassword());

        preparedStatement.executeUpdate();

    } catch (SQLException e) {

        e.printStackTrace();

    } catch (ClassNotFoundException e) {

        e.printStackTrace();

    }

}

public ResultSet getUser(User user) {

    ResultSet resultSet = null;

    if (!user.getUsername().equals("") || !user.getPassword().equals("")) {

        String query = "SELECT * FROM " + Constants.USERS_TABLE + " WHERE " + Constants.USERS_USERNAME + "=?"
                + " AND " + Constants.USERS_PASSWORD + "=?";

    try {

        PreparedStatement preparedStatement = getConnection().prepareStatement(query);
        preparedStatement.setString(1, user.getUsername());
        preparedStatement.setString(2, user.getPassword());

        preparedStatement.executeQuery();

    } catch (SQLException e) {

        e.printStackTrace();

    } catch (ClassNotFoundException e) {

        e.printStackTrace();

    }

    } else {

        System.out.println("Error");

    }

    return resultSet;

}

如果您格式化代码以使其更易于阅读,您将看到dbHandler类中的getUser()方法将在用户名密码均为空时返回 null。 在这种情况下,您只需在屏幕上打印“错误”并继续。 您可能确定这两个值永远不会为空,但编译器不知道这一点。 如果用户名密码都为空时出错,则抛出Exception

public ResultSet getUser(User user) {
    ResultSet resultSet = null;
    if (!user.getUsername().equals("") || !user.getPassword().equals("")) {
        String query = "SELECT * FROM " + Constants.USERS_TABLE + " WHERE "
                + Constants.USERS_USERNAME + "=?" + " AND " + Constants.USERS_PASSWORD + "=?";
        try {
            PreparedStatement preparedStatement = getConnection().prepareStatement(query);
            preparedStatement.setString(1, user.getUsername());
            preparedStatement.setString(2, user.getPassword());
            preparedStatement.executeQuery();
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
        catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    else {
        System.out.println("Error");
    }
    return resultSet;
}

更换这条线怎么样

System.out.println("Error");

throw new RuntimeException("Missing username and/or password.");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM