Rom*_*man 0 java variables static visibility
我有一个设置变量的静态方法:
static String[] playersNames;
public static void setParameters(String[] players) {
playersNames = players;
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个静态块:
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);
}
Run Code Online (Sandbox Code Playgroud)
编译器不会抱怨什么,但当我尝试执行代码时,我遇到了问题.在这个地方SelectPartnerGUI.setParameters(players);我有:
线程"main"java.lang.ExceptionInitializerError中的异常.
它是由这个地方的java.lang.NullpointerException引起的for (String playerName: playersNames).
我的程序没有看到palyersNames吗?
我第一次以这种方式提到课堂:SelectPartnerGUI.setParameters(players);.在我的班级中,我setParameters在有问题的静态块之前有方法.那么,为什么在调用setParameters方法之前调用这个静态块呢?
一旦加载类,就会执行任何静态初始化程序块.在静态初始化程序运行之前,您无法在类上调用方法.您需要playersNames在静态初始化程序块本身中进行设置.请记住,它们按照代码中出现的顺序执行.一个更好的方法IMO是重写整个事物并利用构造函数来构造一个类.
更新:根据您的编辑:
我第一次以这种方式提到课堂:
SelectPartnerGUI.setParameters(players);.在我的班级中,我setParameters在有问题的静态块之前有方法.那么,为什么在调用setParameters方法之前调用这个静态块呢?
一旦类加载,就会调用静态块.当JVM SelectPartnerGUI第一次遇到这种情况时,就会发生这种情况.在JVM加载之前,您不能在类上调用任何(静态)方法.这就像你打开发动机之前不能驾驶汽车.