Java-为什么我的静态变量被设置为null?

Java-为什么我的静态变量被设置为null?,java,javafx,static,java-8,javafx-8,Java,Javafx,Static,Java 8,Javafx 8,编辑1:我想我可能已经弄明白了 这是我的initialize()方法 我认为,当我重新加载groupList ListView时,将调用此SelectEditeProperty侦听器并将其设置为null 我已通过在侦听器中添加一个if条件修复了此问题: public void initialize(URL location, ResourceBundle resources) { groupList.setItems(createGroupFilter()); groupList

编辑1:我想我可能已经弄明白了

这是我的initialize()方法

我认为,当我重新加载groupList ListView时,将调用此SelectEditeProperty侦听器并将其设置为null

我已通过在侦听器中添加一个if条件修复了此问题:

public void initialize(URL location, ResourceBundle resources) {
    groupList.setItems(createGroupFilter());
    groupList.getSelectionModel().selectedItemProperty().addListener(obs -> {
        if(groupList.getSelectionModel().getSelectedItem() != null) {
            Group.setSelectedGroup(groupList.getSelectionModel().getSelectedItem());
            handleGroupSelected();
        }
    });

出于某种原因,我的静态“selectedGroup”变量被设置为null,我无法找出原因

我已执行了以下故障排除

我有一个名为“refresh()”的方法,它调用一个名为“createGroupFilter()”的方法。我包含了以下System.out.println语句,以查看变量何时被置为空

private void refresh() {
    System.out.println("before groupList.setItems(createGroupFilter()); "  + Group.getSelectedGroup()); //TROUBLESHOOTING
    groupList.setItems(createGroupFilter());
    System.out.println("after groupList.setItems(createGroupFilter()); "  + Group.getSelectedGroup()); //TROUBLESHOOTING
    if(Group.getSelectedGroup() != null) {
        groupList.getSelectionModel().select(Group.getSelectedGroup());
        int n = groupList.getSelectionModel().getSelectedIndex();
        groupList.getFocusModel().focus(n);
        groupList.scrollTo(n);
        userList.setItems(createUserFilter());
        if(User.getSelectedUser() != null) {
            userList.getSelectionModel().select(User.getSelectedUser());
        }
    }
}

private FilteredList<Group> createGroupFilter() {
    System.out.println("start createGroupFilter(); " + Group.getSelectedGroup()); //TROUBLESHOOTING
    groups = MainScreenModel.getGroups();
    FilteredList<Group> filteredGroups = new FilteredList<Group>(groups, s -> true);
    groupSearchTxt.textProperty().addListener(obs -> {
        String filter = groupSearchTxt.getText().toLowerCase();
        if(filter == null || filter.trim().length() == 0) {
            filteredGroups.setPredicate(s -> true);
        } else {
            filteredGroups.setPredicate(s -> s.toString().toLowerCase().contains(filter));
        }
    });
    System.out.println("end createGroupFilter(); " + Group.getSelectedGroup()); //TROUBLESHOOTING
    return filteredGroups;
}
所以我觉得groupList.setItems()。。。是导致问题的原因。

以下是MainScreenModel.getGroups()方法供参考:


我看不到您在代码中调用的
setSelectedGroup
。由于
selectedGroup
默认初始化为
null
,如果不调用
setSelectedGroup
,它将保持
null

另一方面,如果(如图所示)
selectedGroup
在某些点上为非null,则您没有显示的某些代码1必须正在调用该方法。Java变量不会自动更改其值

所以


为什么我的静态变量被设置为null

某些东西必须在调用
setSelectedGroup
时使用
null
参数

因此,在我看来,groupList.setItems()。。。是什么导致了这个问题

这是有道理的。也有可能是其他原因造成的;e、 g.另一条线



1-这就是问题所在。

我看不到您在代码中调用的
setSelectedGroup
。由于
selectedGroup
默认初始化为
null
,如果不调用
setSelectedGroup
,它将保持
null

另一方面,如果(如图所示)
selectedGroup
在某些点上为非null,则您没有显示的某些代码1必须正在调用该方法。Java变量不会自动更改其值

所以


为什么我的静态变量被设置为null

某些东西必须在调用
setSelectedGroup
时使用
null
参数

因此,在我看来,groupList.setItems()。。。是什么导致了这个问题

这是有道理的。也有可能是其他原因造成的;e、 g.另一条线



1-这就是问题所在。

setSelectedGroup()方法是否将其设置为null?我看不到您设置它的任何位置,或者我是否遗漏了什么?我也在说,您在哪里填写
静态组selectedGroup我没有看到groupList的声明。它是什么类型的?如果是自定义的,我们可以获取setItems()的源代码吗?setSelectedGroup()方法是否将其设置为null?我看不到您设置它的任何位置,或者我是否遗漏了什么?我刚才也在说,您在哪里填写
静态组selectedGroup我没有看到groupList的声明。它是什么类型的?如果是自定义的,我们可以获取setItems()的源代码吗
private void refresh() {
    System.out.println("before groupList.setItems(createGroupFilter()); "  + Group.getSelectedGroup()); //TROUBLESHOOTING
    groupList.setItems(createGroupFilter());
    System.out.println("after groupList.setItems(createGroupFilter()); "  + Group.getSelectedGroup()); //TROUBLESHOOTING
    if(Group.getSelectedGroup() != null) {
        groupList.getSelectionModel().select(Group.getSelectedGroup());
        int n = groupList.getSelectionModel().getSelectedIndex();
        groupList.getFocusModel().focus(n);
        groupList.scrollTo(n);
        userList.setItems(createUserFilter());
        if(User.getSelectedUser() != null) {
            userList.getSelectionModel().select(User.getSelectedUser());
        }
    }
}

private FilteredList<Group> createGroupFilter() {
    System.out.println("start createGroupFilter(); " + Group.getSelectedGroup()); //TROUBLESHOOTING
    groups = MainScreenModel.getGroups();
    FilteredList<Group> filteredGroups = new FilteredList<Group>(groups, s -> true);
    groupSearchTxt.textProperty().addListener(obs -> {
        String filter = groupSearchTxt.getText().toLowerCase();
        if(filter == null || filter.trim().length() == 0) {
            filteredGroups.setPredicate(s -> true);
        } else {
            filteredGroups.setPredicate(s -> s.toString().toLowerCase().contains(filter));
        }
    });
    System.out.println("end createGroupFilter(); " + Group.getSelectedGroup()); //TROUBLESHOOTING
    return filteredGroups;
}
before groupList.setItems(createGroupFilter()); Group 1
start createGroupFilter(); Group 1
end createGroupFilter(); Group 1
after groupList.setItems(createGroupFilter()); null
public static ObservableList<Group> getGroups() {
    ObservableList<Group> groups = FXCollections.observableArrayList();
    try {
        PreparedStatement stmt = DatabaseConnection.getConnection()
                .prepareStatement("SELECT * FROM groups ORDER BY group_name ASC");
        ResultSet rs = stmt.executeQuery();
        while(rs.next()) {
            String gn = rs.getString("GROUP_NAME");
            String desc = rs.getString("DESCRIPTION");
            groups.add(new Group(gn, desc));
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return groups;
}
public class Group {

    private static Group selectedGroup;

    private final StringProperty groupName   = new SimpleStringProperty();
    private final StringProperty description = new SimpleStringProperty();

    public Group(String hn, String desc) {
        setGroupName(hn);
        setDescription(desc);
    }

    public StringProperty hostNameProperty() {
        return this.groupName;
    }

    public String getGroupName() {
        return this.groupName.get();
    }

    public void setGroupName(String hn) {
        this.groupName.set(hn);
    }

    public StringProperty descriptionProperty() {
        return this.description;
    }

    public String getDescription() {
        return this.description.get();
    }

    public void setDescription(String desc) {
        this.description.set(desc);
    }

    public static Group getSelectedGroup() {
        return selectedGroup;
    }

    public static void setSelectedGroup(Group group) {
        selectedGroup = group;
    }

    @Override
    public String toString() {
        return this.groupName.get();
    }

}