Почему я не вижу статическую переменную в цикле? - PullRequest
0 голосов
/ 22 марта 2010

У меня есть статический метод, который устанавливает переменную:

static String[] playersNames;
public static void setParameters(String[] players) {
playersNames = players;
}

Тогда у меня есть статический блок:

static {
    JRadioButton option;
    ButtonGroup group = new ButtonGroup();
    // Wright a short explanation of what the user should do.
    partnerSelectionPanel.add(new JLabel("Pleas select a partner:"));
    // Generate radio-buttons corresponding to the options available to the player.
            // Bellow is the problematic line causing the null pointer exception:
    for (String playerName: playersNames) {         
        final String pn = playerName;
        option = new JRadioButton(playerName, false);
        option.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent evt) {
                partner = pn;
            }
        });
        partnerSelectionPanel.add(option);
        group.add(option);
    }
    partnerSelectionPanel.add(label);
    // Add the "Submit" button to the end of the "form".
    JButton submitButton = new JButton("Submit");
    submitButton.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent evt) {
            partnerSelected();
        }
    });
    partnerSelectionPanel.add(submitButton);
}

Компилятор не жалуется ни на что, но когда я пытаюсь выполнитькод я получаю проблемы.В этом месте SelectPartnerGUI.setParameters(players); у меня есть:

Исключение в потоке "main" java.lang.ExceptionInitializerError.

, и это вызвано java.lang.NullpointerException atэто место for (String playerName: playersNames).

Моя программа не видит palyersNames?


Первый раз, когда я ссылаюсь на класс таким образом: SelectPartnerGUI.setParameters(players);.И в моем классе у меня есть метод setParameters перед проблемным статическим блоком.Итак, почему этот статический блок вызывается до вызова метода setParameters?

Ответы [ 5 ]

7 голосов
/ 22 марта 2010

Любые статические блоки инициализатора выполняются, как только класс загружается.Вы не можете вызвать метод в классе до запуска статического инициализатора.Вам нужно будет установить playersNames в самом статическом блоке инициализатора.Имейте в виду, что они выполняются в том порядке, в котором они указаны в коде.Лучший подход IMO - переписать все это и использовать конструктор для конструкции класса.

Обновление : согласно вашему редактированию:

Первый раз, когда я обращаюсь к классу таким образом: SelectPartnerGUI.setParameters(players);.И в моем классе у меня есть метод setParameters перед проблемным статическим блоком.Итак, почему этот статический блок вызывается до вызова метода setParameters?

Статический блок вызывается, как только класс загружается.Это уже происходит, когда JVM впервые сталкивается с SelectPartnerGUI.Вы не можете вызывать какие-либо (статические) методы в классе до того, как он будет загружен JVM.Как будто ты не можешь водить машину, пока не включишь двигатель.

2 голосов
/ 22 марта 2010

Помните, что в Java, если у вас есть статический блок, он будет выполняться перед конструктором. Таким образом, ваше PlayersName инициализируется после вашего статического блока. Вы не должны запускать этот тип кода в статических блоках.

2 голосов
/ 22 марта 2010

Это логично, потому что переменная не инициализирована

И блок static выполняется всякий раз, когда к классу обращаются в первый раз.

Следовательно, в этот момент статическая переменная по-прежнему равна null.

Для решения этой проблемы - либо установите начальное значение переменной, либо (возможно, лучше в случае использования) - измените блок инициализации static на метод static и вызывайте его только после вызова метода установки.

0 голосов
/ 22 марта 2010

Как и все остальные, статические блоки выполняются при загрузке класса, задолго до того, как вы что-то сделаете с классом.

Кроме того, дизайн кажется мне немного сомнительным. Вы действительно не видите, что программное обеспечение разработано как последовательность статических блоков, а так много:)

Я бы определенно рекомендовал учебник по свингу для вас.

Далее, переименуйте setParameters в setPlayers, чтобы лучше отражать то, что вы делаете, и инициируйте возможное обновление partnerSelectionPanel при вызове setPlayers. Возможно, вы захотите обновлять эту панель каждый раз, когда она отображается, если игроки не изменились.

0 голосов
/ 22 марта 2010

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

Это null, когда вы достигнете своей петли. Сначала вы должны установить значение для переменной (например, путем вызова установщика).

...