XazGreatXia 2024-07-28 18:18 采纳率: 31%
浏览 2
已结题

Java SwingWorker空指针错误


package ChatExtends;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class LoginWindow extends JFrame {

    User u = new User();

    public void Load() throws Exception{

        this.setName("Login");

        this.setLayout(null);

        this.setSize(600,600);

        this.setResizable(false);

        this.setLocationRelativeTo(null);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        ImageIcon mlogo = new ImageIcon("images/mlogo.png");

        this.setIconImage(mlogo.getImage());

        Container ct = this.getContentPane();

        JPanel jp1 = new JPanel();

        JPanel jp2 = new JPanel();

        JPanel jp3 = new JPanel();

        JPanel jp4 = new JPanel();

        jp1.setSize(600, 150);

        jp2.setBounds(0,150,500,300);

        GridLayout gy = new GridLayout(4,1,5,5);

        this.setLayout(gy);

        jp4.setLayout(null);

        jp4.setSize(600,150);

        jp4.setVisible(true);

        Font f = new Font("Blackletter",Font.ITALIC,100);

        JLabel name = new JLabel("ChatW");

        name.setFont(f);

        name.setBounds(100,300,600,300);

        name.setForeground(Color.blue);

        name.setVisible(true);

        jp1.add(name);

        JLabel l = new JLabel();

        ImageIcon ic1 = new ImageIcon("images/login.png");

        l.setIcon(ic1);

        //l.setBounds(0, 100, ic1.getIconWidth(), ic1.getIconHeight());

        l.setVisible(true);

        l.setHorizontalAlignment(SwingConstants.CENTER);

        l.setVerticalAlignment(SwingConstants.CENTER);

        JTextField text1 = new JTextField(15);

        text1.setVisible(true);

        JLabel l1 = new JLabel();

        ImageIcon ic2 = new ImageIcon("images/lock.png");

        l1.setIcon(ic2);

        //l1.setBounds(0,300,ic2.getIconWidth(),ic2.getIconHeight());

        l1.setVisible(true);

        l1.setHorizontalAlignment(SwingConstants.CENTER);

        l1.setVerticalAlignment(SwingConstants.CENTER);

        JPasswordField jf = new JPasswordField(15);

        //jf.setBounds(50,300,200,100);

        Font b = new Font("Arial",Font.ITALIC,50);

        JButton jb1 = new JButton("Login");

        jb1.setBounds(50,0,200,100);

        jb1.setFont(b);

        jb1.setBorder(null);

        jb1.setFocusPainted(false);

        jb1.setVisible(true);

        jb1.addActionListener((ActionEvent e) -> {

            u.name = text1.getText().trim();

            u.pass = new String(jf.getPassword());

            LoginWorker lw = new LoginWorker(u.name, u.pass);

            lw.execute();

            if(lw.flag == true) {

            try {

                ChatWindow chat = new ChatWindow();

                chat.SetUserName(u.name);

                chat.load();

            } catch (Exception e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }

            } else if(lw.flag == false){

                return;

            } else if(lw.flag == null) {

                return;

            } else {

                return;

            }

        });

        JButton jb2 = new JButton("Register");

        jb2.setBounds(350,0,200,100);

        jb2.setFont(b);

        jb2.setBorder(null);

        jb2.setFocusPainted(false);

        jb2.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent t) {

                RegisterWindow regis = new RegisterWindow();

                regis.load();

            }

        });

        jb2.setVisible(true);

        jp4.add(jb1);

        jp4.add(jb2);

        jp2.add(l);

        jp2.add(text1);

        jp3.add(l1);

        jp3.add(jf);

        jp2.setVisible(true);

        this.add(jp1);

        this.add(jp2);

        this.add(jp3);

        this.add(jp4);

        this.setVisible(true);

        ct.add(jp1,"North");

        ct.add(jp2,"Center");

        ct.add(jp3,"Center");

        ct.add(jp4,"South");

    }

    
}

class LoginWorker extends SwingWorker<Boolean,Boolean> {

    private String name;

    private String pass;

    public Boolean flag;

    public LoginWorker(String name,String pass) {

        this.name = name;

        this.pass = pass;

    }

    @Override 

    protected Boolean doInBackground() throws Exception {

        UserOperation t = new UserOperation();

        return t.CheckUser(name, pass);

    }

    @SuppressWarnings("unused")
    @Override
    
    protected void done() {

        try {
            
            boolean result = get();

            if(result) {

                ImageIcon i1 = new ImageIcon("images/correct.png");

                JOptionPane.showMessageDialog(null, "Login Success","",JOptionPane.OK_CANCEL_OPTION,i1);

                flag = true;

            } else {

                ImageIcon i2 = new ImageIcon("images/error.png");

                JOptionPane.showMessageDialog(null, "Login Failed!The login or password is invaild!","",JOptionPane.OK_CANCEL_OPTION,i2);

                flag = false;

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

class User {

    String name;

    String pass;

}

请问这段代码哪里出错了,为什么最好会报一个空指针错误呢

  • 写回答

1条回答 默认 最新

  • 专家-司宇[在线] 2024-07-28 18:18
    关注

    引自免费微信小程序:皆我百晓生

    根据您提供的代码和描述,我发现了可能引发空指针错误的原因。问题在于您的代码逻辑中的一些问题和异常处理的不完整。在 LoginWorker 类中,您使用了 SwingWorkerget() 方法来获取异步任务的结果,但在这个方法中,如果没有正确地处理异常,就可能导致空指针异常。下面是一些可能导致空指针异常的点:

    1. LoginWorkerdone() 方法中,您调用了 get() 方法来获取异步任务的结果。如果 doInBackground() 方法抛出异常并且没有被捕获处理,那么在调用 get() 方法时,它会抛出执行异常(ExecutionException)。如果在这种情况下没有正确处理这个异常,就可能导致空指针异常。

    解决方法是在调用 get() 方法时,使用 try-catch 语句来捕获并处理可能抛出的异常。您可以在捕获异常后适当地处理或记录异常信息,以避免空指针异常的发生。示例代码如下:

    try {
        boolean result = get(); // 获取异步任务的结果
        if (result) {
            // 登录成功逻辑
        } else {
            // 登录失败逻辑
        }
    } catch (ExecutionException e) {
        // 处理异常,避免空指针异常
        e.printStackTrace();
    } catch (InterruptedException e) {
        // 处理中断异常
        Thread.currentThread().interrupt(); // 恢复中断状态
    }
    

    另外,还有一些其他需要注意的地方:

    • 在您的代码中,您使用了 setLayout(null) 来设置窗口的布局为 null 布局。虽然这可以手动设置组件的位置和大小,但这样做可能导致一些不可预见的问题和布局的不一致性。建议使用布局管理器(如 BorderLayout、GridLayout 等)来管理组件的布局。
    • 在设置组件的边界和位置时,使用 setBounds() 方法时要注意坐标和大小的正确性。确保组件的位置和大小符合您的设计要求。
    • 在使用 Swing 组件时,确保在事件分发线程(EDT)中进行 UI 操作。这可以避免一些并发问题并改善 UI 的响应性。您可以使用 SwingUtilities.invokeLater()SwingUtilities.invokeAndWait() 方法来在 EDT 中执行 UI 操作。

    综上所述,通过在调用 get() 方法时正确处理异常,并检查代码中的其他潜在问题,应该能够解决空指针异常的问题。希望这些解决方案能帮助您解决问题!如果您还有其他问题或需要进一步的帮助,请随时提问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月7日
  • 已采纳回答 8月7日
  • 创建了问题 7月28日

悬赏问题

  • ¥15 这是有什么问题吗,我检查许可证了但是显示有呢
  • ¥15 机器学习预测遇到的目标函数问题
  • ¥15 python的EOFError该怎么解决?
  • ¥15 Fluent,液体进入旋转区域体积分数不连续
  • ¥15 java linux下将docx文件转pdf
  • ¥15 maven无法下载依赖包
  • ¥15 关于pycharm, Callable[[str],bool]作为方法参数使用时, lambda 类型不提示问题
  • ¥15 layui数据重载无效
  • ¥15 寻找了解qq家园纵横四海的程序猿。
  • ¥15 optisystem