我正在阅读一本书,下面的代码在单击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!");
}
}
答案 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的新手,请采取以下几点建议。
private
是button
变量