1

我正在阅读一本书,当单击 JButton 时,以下代码在运行时在 button.actionPerformed 行处引发 NPE。我已尽力确保我的代码与书中的内容完全相同,有人可以指出我的问题吗?(这本书是为 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!");
}

}
4

5 回答 5

3

原因是这条线:

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

在这里,您正在创建隐藏成员变量的新本地JButton对象。因此仍然是。您应该改用:buttonbuttonnull

button = new JButton("click here");
于 2013-04-27T18:52:53.960 回答
2

在一个方法中,你有这个:

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

这会创建变量,但这个新变量的范围在方法内部。不过,您已经button在课堂上声明了。它应该只是:

button = new JButton("click here");
于 2013-04-27T18:52:44.567 回答
2

你正在隐藏你的变量。

您声明button为类变量,但在您的方法中重新声明go,这意味着类变量(您在actionPerformed方法中引用)为空

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

于 2013-04-27T18:53:31.650 回答
2

好吧,您JButton button; 仍然null是。您没有在程序中的任何地方分配它

于 2013-04-27T18:54:36.493 回答
2

这个问题被称为“变量隐藏”或“隐藏变量”或“阴影变量”。这意味着,一个局部变量隐藏了另一个同名的变量。您已经buttongo方法中重新定义了变量。刚刚从 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. 使用访问说明符。private是一个很好的button变量说明符
  3. 即使可以自动创建构造函数(默认构造函数),最好自己编写代码,至少是空白的。
于 2013-04-27T19:12:07.627 回答