Java从MySQL读取数据填充jTable时触发异常进入catch块求助
问题排查及修复方案
第一步:先获取具体异常信息
你当前的catch块只输出固定的Connection Error,完全无法定位问题,先修改catch块打印异常详情:
catch (Exception e) { e.printStackTrace(); // 控制台打印完整错误堆栈 JOptionPane.showMessageDialog(null, "错误:" + e.getMessage()); // 弹窗展示错误信息 }
运行后根据控制台或弹窗的具体报错可以更精准定位,以下是你代码中已经明确存在的必现问题:
已知问题列表
- SQL语法错误
你的查询语句写的是select *from,*和from之间缺少空格,拼接后SQL语法非法,MySQL会直接抛出语法异常,正确写法为select * from。 - ResultSet游标操作异常
DbUtils.resultSetToTableModel(rs)方法执行时会遍历整个ResultSet读取所有数据,执行完成后ResultSet的游标已经移动到末尾,且默认创建的Statement生成的ResultSet是仅向前遍历、不可回滚的,此时再调用rs.first()会直接抛出操作不支持的异常。
另外你使用while(rs.first())逻辑错误:rs.first()是将游标跳转到第一行,只要存在数据返回值永远为true,会进入死循环。 - 存在SQL注入风险
直接把用户输入的PatientID拼接到SQL中,一旦用户输入特殊字符(比如单引号、SQL注入语句),既会导致SQL语法错误,也存在严重的安全问题,应该使用PreparedStatement代替Statement。 - 资源未释放
Connection、Statement、ResultSet用完后没有关闭,会造成数据库连接资源泄漏,运行多次后会因为连接耗尽报错。
修复后代码示例
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { String patientID = jtxtPatientID.getText().trim(); // 先做非空校验 if (patientID.isEmpty()) { JOptionPane.showMessageDialog(null, "请输入患者ID"); return; } String sql = "select * from patient where PatientID = ?"; // 用try-with-resources自动关闭资源 try (Connection con = ConnectionProvider.getCon(); PreparedStatement pst = con.prepareStatement(sql)) { pst.setString(1, patientID); ResultSet rs = pst.executeQuery(); jTable1.setModel(DbUtils.resultSetToTableModel(rs)); // 直接判断表格行数即可,不需要再操作ResultSet if (jTable1.getRowCount() > 0) { jlbPID.setVisible(false); jtxtPatientID.setEditable(false); } else { JOptionPane.showMessageDialog(null, "未找到对应患者信息"); } } catch (Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(null, "操作失败:" + e.getMessage()); } }
内容的提问来源于stack exchange,提问作者ThangNQ
相关产品推荐
相关产品推荐

