1

我正在尝试显示文本 - 当您按下其中一个按钮时“您按下了按钮”。
我得到一个NullPointerException. 我已经在类的构造函数中初始化了按钮,初始化后,我从main().

这是代码:

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class ButtonDemo implements ActionListener{
    JLabel jlab;

    ButtonDemo(){
        JFrame jfrm = new JFrame("A Button Example");

        jfrm.setLayout(new FlowLayout());

        jfrm.setSize(220, 90);
        jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton jbtnUp = new JButton("Up");
        JButton jbtnDown = new JButton("Down");

        jbtnUp.addActionListener(this);
        jbtnDown.addActionListener(this);

        jfrm.add(jbtnUp);
        jfrm.add(jbtnDown);

        JLabel jlab = new JLabel("Press a button.");

        jfrm.add(jlab);
        jfrm.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        if(ae.getActionCommand().equals("Up"))
            jlab.setText("You pressed Up.");
        else
            jlab.setText("You pressed Down.");
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ButtonDemo();
            }
        });
    }
}

此异常的原因是什么,我该如何解决?
问候。

4

2 回答 2

3

您的代码通过在构造函数中重新声明变量 jlab 来隐藏变量 jlab,从而使类字段为空。不要那样做,你的 NPE 就会消失。

即,改变这个:

ButtonDemo(){
    JFrame jfrm = new JFrame("A Button Example");

    // ...

    // the variable below is being re-declared in the constructor and is thus
    // local to the constructor. It doesn't exist outside this block.
    JLabel jlab = new JLabel("Press a button.");

    // ...
}

对此:

ButtonDemo(){
    JFrame jfrm = new JFrame("A Button Example");

    // ...

    jlab = new JLabel("Press a button."); // note the difference!

    // ...
}

解决 NPE 的关键是仔细检查引发异常的行,因为该行上使用的一个变量为空。如果您知道这一点,您通常可以检查其余代码并找到问题并解决它。

于 2013-01-27T19:05:54.277 回答
1

actionPerformed 方法中的 jlab 是指您在构造函数 ButtonDemo 之外声明的 JLabel 。除非您对其进行初始化(即 jlab=new JLabel()),否则它将为 null 。因此您会得到一个 Exception 。

于 2013-01-27T19:14:50.563 回答