JButton.actionPerformed:空指针异常

时间:2013-04-27 18:51:32

标签: java swing jbutton

我正在阅读一本书,下面的代码在单击JButton时在运行时抛出一个NPE,位于button.actionPerformed行。我已尽力确保我的代码正是本书中的内容,有人可以指出我的问题吗? (这本书是为java 5编写的,我使用的是最新的java 7,但就我所知,这在以下代码中应该没有区别)

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

public class SimpleGui implements ActionListener {
JButton button;
public static void main(String[] args) {
    SimpleGui gui = new SimpleGui();
    gui.go();
}

public void go() {
    JFrame frame = new JFrame();
    JButton button = new JButton("click here");

    button.addActionListener(this);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.getContentPane().add(button);
    frame.setSize(300,300);
    frame.setVisible(true);
}

public void actionPerformed(ActionEvent event) {
    button.setText("I've been clicked, argh!");
}

}

5 个答案:

答案 0 :(得分:3)

原因是这条线:

JButton button = new JButton("click here");

在这里,您要创建新的本地JButton对象,shadowing成员变量button。因此button仍为null。你应该使用:

button = new JButton("click here");

答案 1 :(得分:2)

在方法中,您有:

JButton button = new JButton("click here");

这会创建变量,但此新变量的范围是在方法中。你已经在课堂上宣布了button。它应该只是:

button = new JButton("click here");

答案 2 :(得分:2)

你正在掩盖变量。

您将button声明为类变量,但在go方法中重新声明,这意味着类变量(在actionPerformed方法中引用)为null < / p>

JButton button = new JButton("click here");更改为button = new JButton("click here");

答案 3 :(得分:2)

好吧,您的JButton button;仍然是null。您的计划中没有将其分配到任何地方

答案 4 :(得分:2)

此问题称为“可变隐藏”或“隐藏变量”或“隐藏变量”。这意味着,局部变量隐藏了另一个具有相同名称的变量。您已在button方法中重新定义了变量go。刚刚从go方法中删除了re定义,因此它可以正常工作。看看下面的代码

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

public class SimpleGui implements ActionListener {
JButton button;
public static void main(String[] args) {
    SimpleGui gui = new SimpleGui();
    gui.go();
}

public void go() {
    JFrame frame = new JFrame();
     button = new JButton("click here"); //Variable Re definition removed

    button.addActionListener(this);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.getContentPane().add(button);
    frame.setSize(300,300);
    frame.setVisible(true);
}

public void actionPerformed(ActionEvent event) {
    button.setText("I've been clicked, argh!");
}

}

由于您似乎是Java GUI的新手,请采取以下几点建议。

  1. 在构造函数
  2. 中定义类变量始终是最佳实践
  3. 使用访问说明符。 privatebutton变量
  4. 的良好说明符
  5. 即使构造函数可以自动创建(默认构造函数),最好用自己编写代码,至少是空白代码。