actionPerformed方法中的NullPointerException但不在main中?

时间:2016-03-10 16:13:22

标签: java

    public class DictionaryClient implements ActionListener {

      JFrame frame = new JFrame("Amazing CW");
      JPanel panel = new JPanel();
      JButton button = new JButton("Send");
      JTextField  text = new JTextField("Field");
      Book book;
      DictionaryService port;

    public DictionaryClient() {

    panel.add(button);
    panel.add(text);
    frame.add(panel);
    button.addActionListener(this);
    frame.setSize(300,300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    }

    public static void main(String[] args){

    DictionaryClient client = new DictionaryClient();
    DictionaryServiceService service = new DictionaryServiceService();
    DictionaryService port = service.getDictionaryServicePort();

    Book book = port.sendBook();

}

    @Override
     public void actionPerformed(ActionEvent e) {
               if(e.getSource() == button){
                  System.out.print(book.getAuthor() + " " + book.getTitle());
               }
        }
}

我理解NullPointerException是什么,但是当我移动

时,我的代码不理解这个错误
System.out.print(book.getAuthor() + " " + book.getTitle());

退出行动执行我完全没有问题。

3 个答案:

答案 0 :(得分:4)

Book book = port.sendBook();

创建名为book的局部变量。它不会影响book类中的字段DictionaryClient,该字段的默认值为null。将其更改为:

client.book = port.sendBook();

这会将值分配给DictionaryClient对象上的正确字段。

就像现在一样,只要main方法结束并且局部变量超出范围,该值就会丢失。当您将print移动到main方法中时,它能够引用局部变量,但在actionPerformed方法中,范围中唯一的book字段是从未初始化的字段。

答案 1 :(得分:2)

您的Book对象在main方法中只有本地范围。您需要将其范围更改为类的本地(您已经引用过)。

只需更改此行

即可
List<A1> a1list = b1.getMyGenericList();

Book book = port.sendBook();

这将正确设置类级别书变量。然后,您的actionPerformed方法将相应地引用该实例变量。

答案 2 :(得分:0)

检查一下: 以下声明/初始化

Book book = port.sendBook();

是在静态main方法内部进行的,由于您的类 DictionaryClient 具有相同名称的成员,因此main方法中的此对象为 shadowing DictionaryClient的书,当actionPerformed被触发时,你不再是静态主体,所以你预订定义好了初步确定有好的... 该范围内唯一可用的书是在班级中定义的......

但是从未初始化因此是NPE。