变量为null但它确实不是?

dzi*_*iki 1 java alert javafx

我正在使用Java + JavaFX编写一个小应用程序.

在控制器类我有我的PasswordField:

@FXML
PasswordField password;
Run Code Online (Sandbox Code Playgroud)

以及临时存储密码的字段:

private String rootPassword;
Run Code Online (Sandbox Code Playgroud)

然后我有一个方法来处理密码:

private void handlePasswordField() {
    if (!password.getText().isEmpty()) {
        this.rootPassword = password.getText();
    } else {
        Alert alert = new Alert(AlertType.WARNING);
        alert.initOwner(nbtcInstaller.getPrimaryStage());
        alert.setTitle("No password");
        alert.setHeaderText("No password provided");
        alert.setContentText("Please enter a new ROOT password");
        alert.showAndWait();
    }
}
Run Code Online (Sandbox Code Playgroud)

以及按下"安装"按钮后启动的方法:

@FXML
private void handleCommand() {
    handlePasswordField();
    doAllTheOtherStuff();
    Platform.exit();
}
Run Code Online (Sandbox Code Playgroud)

当我没有提供密码时,我会收到警报,但doAllTheOtherStuff()仍然会启动.doAllTheOtherStuff()如果没有提供密码,我该怎么做才能阻止它启动方法?

Jor*_*lla 6

只需使方法返回一个布尔值:

private boolean handlePasswordField() {
    if (!password.getText().isEmpty()) {
        this.rootPassword = password.getText();
        return true;
    } else {
        Alert alert = new Alert(AlertType.WARNING);
        alert.initOwner(nbtcInstaller.getPrimaryStage());
        alert.setTitle("No password");
        alert.setHeaderText("No password provided");
        alert.setContentText("Please enter a new ROOT password");
        alert.showAndWait();
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在必要时检查出来:

@FXML
private void handleCommand() {
    if(handlePasswordField()) {
        doAllTheOtherStuff();
    }
    Platform.exit();
}
Run Code Online (Sandbox Code Playgroud)

最后的建议是将方法的名称更改为更清晰,但这只是可选的:

private boolean isPasswordValid() {
Run Code Online (Sandbox Code Playgroud)

然后if会更自然:

if(isPasswordValid()) {
Run Code Online (Sandbox Code Playgroud)