I have a static method which sets a variable:
static String[] playersNames;
public static void setParameters(String[] players) {
playersNames = players;
}
Then I have a static block:
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);
}
Compiler does not complain about anything but when I try to execute the code I get problems. In this place SelectPartnerGUI.setParameters(players); I have:
Exception in thread “main”
java.lang.ExceptionInitializerError.
and it is cause by java.lang.NullpointerException at this place for (String playerName: playersNames).
Does my program do not see the palyersNames?
The first time I refer to the class in this way: SelectPartnerGUI.setParameters(players);. And in my class I have the setParameters method before the problematic static block. So, why this static block is called before the setParameters method is called?
Any static initializer blocks get executed as soon as the class get loaded. You can impossibly call a method on a class before the static initializer runs. You’ll need to set the
playersNamesin the static initializer block itself. Keep in mind that they’re executed in the order as they appear in the code. A better approach IMO is to rewrite the whole thing and make use of a constructor to construct a class.Update: as per your edit:
The static block is called as soon as the class get loaded. This already happens when the JVM encounters
SelectPartnerGUIfor the first time. You cannot call any (static) methods on a class before it’s loaded by JVM. It’s like that you cannot drive the car before you turn on the engine .