2016-06-13 3 views
1

РЕДАКТИРОВАТЬ 1: Я думаю, что, возможно, понял это.Java - Почему моя статическая переменная имеет значение null?

Вот мой метод инициализации()

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

Я думаю, что, когда я перезагрузить этот ListView списке групп selectedItemProperty слушатель вызывается и его установка на нуль.

Я это исправил, добавив, если условие внутри слушателя:

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» в настоящее время установлен в нулевое значение, и я не могу понять, почему.

Я выполнил следующие действия по устранению неполадок.

У меня есть метод, называемый '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; 
} 

Это обеспечивает следующий вывод:

before groupList.setItems(createGroupFilter()); Group 1 
start createGroupFilter(); Group 1 
end createGroupFilter(); Group 1 
after groupList.setItems(createGroupFilter()); null 

Так что мне кажется, что groupList.setItems() ... это то, что вызывает проблему.

Для справки, здесь является MainScreenModel.getGroups() метод:

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(); 
    } 

} 
+2

Использует ли метод setSelectedGroup() значение null? – NormR

+3

Я не вижу места, где вы его устанавливаете, или я чего-то не хватает? – Itai

+1

Я говорил о том же, где вы заполняете 'static Group selectedGroup;' –

ответ

6

Я не могу увидеть где-нибудь, что вы называете setSelectedGroup в вашем коде. Поскольку selectedGroup по умолчанию инициализирован null, он останется null, если вы не вызываете setSelectedGroup.

С другой стороны, если (как это кажется) selectedGroup является ненулевым в определенных точках, то некоторый код , что вы не показали нам необходимо вызвать метод. Переменная Java не изменяет свое значение спонтанно.

Так ....


Почему моя статическая переменная быть установлен в нуль?

Что-то должно быть вызова setSelectedGroup где-то с параметром null.

Так что мне кажется, что причиной является проблема с groupList.setItems() ....

Это правдоподобно.Также возможно, что что-то другое вызывает его; например другой поток.


1 - В этом была проблема.

+0

См. Мое редактирование, спасибо за вашу помощь :) – ColonelSpuds

Смежные вопросы