Java 如何修复此AWT-EventQueue-0异常

Java 如何修复此AWT-EventQueue-0异常,java,swing,user-interface,exception,awt-eventqueue,Java,Swing,User Interface,Exception,Awt Eventqueue,我用JavaSwing编写了一个库登录页面,并尝试运行它。该页面可以正常运行,但当我键入任何用户名,选择一种类型并按login时,它会引发一个AWT-EventQueue-0:NullPointerException Library类反序列化包含用户和图书信息的两个文件,并将它们初始化为对象 用户是成员和职员的父类,Book类表示一本书及其标题、说明、副本。这些类的方法都是正确的 LoginWindow.java 导入java.awt.EventQueue; 导入javax.swing.*; 导

我用JavaSwing编写了一个库登录页面,并尝试运行它。该页面可以正常运行,但当我键入任何用户名,选择一种类型并按login时,它会引发一个
AWT-EventQueue-0:NullPointerException

Library类反序列化包含用户和图书信息的两个文件,并将它们初始化为对象

用户是成员和职员的父类,Book类表示一本书及其标题、说明、副本。这些类的方法都是正确的

LoginWindow.java

导入java.awt.EventQueue;
导入javax.swing.*;
导入java.awt.event.ActionListener;
导入java.awt.event.ActionEvent;
公共类登录窗口{
私有JFrame-frmLogIn;
私有JTextField textField;
/**
*启动应用程序。
*/
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
LoginWindows窗口=新建LoginWindows();
window.frmLogIn.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
/**
*初始化框架的内容。
*/
公共登录窗口(){
frmLogIn=newjframe();
JLabel lblName=新的JLabel(“名称”);
lblName.挫折(23,25,46,14);
frmLogIn.getContentPane().add(lblName);
JLabel lblType=新的JLabel(“类型:”);
LBL型立根(23,56,46,14);
frmLogIn.getContentPane().add(lblType);
JTextField textField=新的JTextField();
textField.setBounds(71,22,158,20);
frmLogIn.getContentPane().add(textField);
textField.setColumns(10);
JComboBox comboBox=新的JComboBox();
setModel(新的DefaultComboxModel(新字符串[]{“Staff”,“Member”}));
组合框.立根(71,53,158,20);
frmLogIn.getContentPane().add(组合框);
JButton btnNewButton=新JButton(“登录”);
addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件arg0){
如果(!Library.users.containsKey(textField.getText())){
新建CreateUserWindow();
frmLogIn.dispose();
}
如果(!Library.users.get(textField.getText()).getUserType().equals(comboBox.getActionCommand()),则为else{
JOptionPane.showMessageDialog(null,
“用户名和用户类型不匹配,请重试。”,
“用户信息不匹配”,作业窗格。错误消息);
}
否则{
字符串类型=comboBox.getActionCommand();
if(type.equals(“Staff”))新建StaffWindow((Staff)Library.users.get(textField.getText());
else新成员窗口((成员)Library.users.get(textField.getText());
}
}
});
btnNewButton.setBounds(23,88206,23);
frmLogIn.getContentPane().add(btnNewButton);
frmLogIn.setTitle(“登录”);
frmLogIn.立根(100100268185);
frmLogIn.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmLogIn.getContentPane().setLayout(null);
frmLogIn.setVisible(真);
}
}
Library.java

import java.io.*;
导入java.text.ParseException;
导入java.time.LocalDateTime;
导入java.time.format.DateTimeFormatter;
导入java.util.*;
公共类库实现了可序列化{
公共静态HashMap用户;
公共静态哈希映射书;
公共库(boolean readFromSerialized)引发IOException,ClassNotFoundException{
users=newhashmap();
books=新建HashMap();
如果(readFromSerialized){
ObjectInputStream u_in=新的ObjectInputStream(新文件inputstream(“./Assignment/data/Users.txt”);
ObjectInputStream b_in=新ObjectInputStream(新文件InputStream(“./Assignment/data/Books.txt”);
users=(HashMap)u_in.readObject();
books=(HashMap)b_in.readObject();
u_in.close();
b_in.close();
}
}
公共静态void serializeToFile(){
试一试{
ObjectOutputStream u_out=新的ObjectOutputStream(新文件OutputStream(“./Assignment/data/Users.txt”);
ObjectOutputStream b_out=新的ObjectOutputStream(新文件OutputStream(“./Assignment/data/Books.txt”);
u_out.writeObject(Library.users);
b_out.writeObject(图书馆、书籍);
关上;
b_out.close();
}捕获(例外情况除外){}
}
}
错误消息显示以下代码段包含一些错误,该代码是关于用户信息验证的:

if(!Library.users.containsKey(textField.getText())){
新建CreateUserWindow();
frmLogIn.dispose();
}

您的代码中有几个问题:

  • 使用
    setBounds
    null布局
    setLayout(null)
    ),这是并且可能会导致恼人的问题,例如,为了使您的应用程序在所有操作系统和PLAF中正确呈现,请使用适当的设置

  • 使用
    公共静态
    成员,这可能会导致应用程序流中的不一致

  • 现在,您的问题是创建一个全局
    textfield
    变量,但从不初始化它(因此它是
    null

    然后,在构造函数上创建另一个具有相同名称的构造函数,但它是一个局部变量:

    JTextField textField = new JTextField();
    
    JTextField textField = new JTextField();
    
    当你打这个电话时:

    else if (!Library.users.get(textField.getText()).getUserType().equals(comboBox.getActionCommand())) {
    
    Java使用的是global变量(记住它是
    null
    ),而不是local变量(已初始化),为了解决这个问题,请删除JTextField textField = new JTextField();
    textField = new JTextField();