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());
退出行动执行我完全没有问题。
答案 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。