为什么我在循环中看不到静态变量?

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方法之前调用这个静态块呢?

Bal*_*usC 7

一旦加载类,就会执行任何静态初始化程序块.在静态初始化程序运行之前,您无法在类上调用方法.您需要playersNames在静态初始化程序块本身中进行设置.请记住,它们按照代码中出现的顺序执行.一个更好的方法IMO是重写整个事物并利用构造函数来构造一个类.

更新:根据您的编辑:

我第一次以这种方式提到课堂:SelectPartnerGUI.setParameters(players);.在我的班级中,我setParameters在有问题的静态块之前有方法.那么,为什么在调用setParameters方法之前调用这个静态块呢?

一旦类加载,就会调用静态块.当JVM SelectPartnerGUI第一次遇到这种情况时,就会发生这种情况.在JVM加载之前,您不能在类上调用任何(静态)方法.这就像你打开发动机之前不能驾驶汽车.

  • 然后*just*只构造它的一个实例.你认为它只有一个实例并不一定意味着你需要让一切都是静态的.有些人只有一辆车,但这并不意味着你应该让汽车静止.顺便说一句:单身模式可能不适用于此.您可以完全控制代码.如上所述,只创建它的一个实例并永远重用它.就这样. (2认同)