You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java NetBeans员工数据插入时MySQL连接空指针异常修复求助

修复Java NetBeans中MySQL连接空指针异常(添加员工功能)

你遇到的java/lang.NullPointerException核心原因是:类中声明的数据库连接对象con从未初始化,调用con.prepareStatement()时自然触发空指针。下面是具体修复步骤:

1. 添加数据库连接初始化方法

在Dashboard类中新增获取数据库连接的方法,替换为你的实际数据库配置:

private void connectDB() {
    try {
        // 加载MySQL驱动(MySQL 8.0+可省略,保留兼容旧版本)
        Class.forName("com.mysql.cj.jdbc.Driver");
        // 替换为你的数据库地址、用户名、密码
        String dbUrl = "jdbc:mysql://localhost:3306/你的数据库名?useSSL=false&serverTimezone=UTC";
        String dbUser = "你的数据库用户名";
        String dbPwd = "你的数据库密码";
        con = DriverManager.getConnection(dbUrl, dbUser, dbPwd);
    } catch (ClassNotFoundException | SQLException ex) {
        JOptionPane.showMessageDialog(null, "数据库连接失败:" + ex.getMessage());
        Logger.getLogger(Dashboard.class.getName()).log(Level.SEVERE, null, ex);
    }
}

2. 在构造函数中初始化连接

修改两个构造函数,初始化窗口后立即建立数据库连接:

public Dashboard() {
    initComponents();
    this.setLocationRelativeTo(null); // 窗口居中
    connectDB(); // 初始化数据库连接
}

public Dashboard(String empName,String empDes) {
    initComponents();
    EmpName.setText(empName.toUpperCase());
    EmpDesignation.setText(empDes.toUpperCase());
    this.setLocationRelativeTo(null); // 窗口居中
    connectDB(); // 初始化数据库连接
}

3. 修正JDBC导入(避免强转)

删除MySQL特定的驱动类导入:

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

保留标准JDBC接口导入import java.sql.*即可,后续con.prepareStatement(sql)无需强转。

4. 优化添加员工方法(避免资源泄漏)

修改jButton1ActionPerformed方法,添加连接校验和资源关闭逻辑:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                        
    int confirm = JOptionPane.showConfirmDialog(null, "确定要添加这条记录吗?","添加记录",JOptionPane.YES_NO_OPTION);
    if (confirm == 0){
        PreparedStatement pst = null;
        try{
            if(con == null) {
                JOptionPane.showMessageDialog(null, "数据库未连接,请检查配置");
                return;
            }
            String sql = "INSERT INTO `employee_list`(`firstname`, `lastname`, `department`, `designation`, `number`, `address`, `salary`) VALUES (?,?,?,?,?,?,?)";
            pst = con.prepareStatement(sql);
           
            pst.setString(1, txtFname.getText());
            pst.setString(2, txtLname.getText());
            pst.setString(3, txtDepartment.getSelectedItem().toString());
            pst.setString(4, txtDesignation.getSelectedItem().toString());
            pst.setString(5, txtNumber.getText());
            pst.setString(6, txtAddress.getText());
            pst.setString(7, txtSalary.getText());
           
            int rows = pst.executeUpdate();
            if(rows > 0){
                JOptionPane.showMessageDialog(null, "数据保存成功");
                reset();
            } else {
                JOptionPane.showMessageDialog(null, "数据未保存到数据库");
            }
        }catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "保存失败:" + ex.getMessage());
            Logger.getLogger(Dashboard.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            // 关闭资源
            try {
                if(pst != null) pst.close();
                // 若不需要长期保持连接,可添加:if(con != null) con.close();
            } catch (SQLException ex) {
                Logger.getLogger(Dashboard.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    } else {
        JOptionPane.showMessageDialog(null, "已取消添加记录");
    }
}

5. 修复部门选择重复添加职位的问题

原代码每次选择部门都会重复添加职位,修改txtDepartmentItemStateChanged方法先清空旧选项:

private void txtDepartmentItemStateChanged(java.awt.event.ItemEvent evt) {                                              
    ArrayList<String> array = new ArrayList<>();
    // 清空现有职位选项,保留默认空选项
    txtDesignation.removeAllItems();
    txtDesignation.addItem("");
    
    if(txtDepartment.getSelectedItem().equals("Management")){
        array.add("Head Officer");
        array.add("General Manager");
        array.add("Senior Manager");
        array.add("Junior Manager");
    } else if (txtDepartment.getSelectedItem().equals("HR")){
        array.add("HR Manager");
        array.add("HR Assistent manager");
        array.add("HR Assistent");
        array.add("HR Administrator");
    } else if (txtDepartment.getSelectedItem().equals("Production")){
        array.add("Production Manager");
        array.add("Production Assistent manager");
        array.add("Assistent");
        array.add("Administrator");
    }else if (txtDepartment.getSelectedItem().equals("Sales")){
        array.add("Sales Manager");
        array.add("Sales Assistent manager");
        array.add("Assistent");
        array.add("Administrator");
    }else if (txtDepartment.getSelectedItem().equals("Marketing")){
        array.add("Marketing Manager");
        array.add("Marketing Assistent manager");
        array.add("Assistent");
        array.add("Administrator");
    }else if (txtDepartment.getSelectedItem().equals("IT")){
        array.add("Computer System Manager");
        array.add("Service Desk Analyst");
        array.add("Assistent");
        array.add("Network Administrator");
    }
    // 批量添加职位选项
    for(String des : array){
        txtDesignation.addItem(des);
    }
}

内容的提问来源于stack exchange,提问作者THAVIDU

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:47:01