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
相关产品推荐
相关产品推荐

