Java:actionPerformed方法抛出异常问题排查求助
我来帮你一步步排查这段actionPerformed代码里的异常点,顺便给出对应的修复方案:
1. 未完成的代码拼写错误
你代码里的second.setVisibl...明显是拼写失误,正确的方法名是setVisible(true)——少了最后一个字母'e'。这个错误会直接导致编译失败,或者如果是运行时动态加载场景,会抛出NoSuchMethodError,这是最直观的问题,先把这个拼写补上。
2. 数据库资源未关闭,存在泄漏风险
你获取了Connection、PreparedStatement和ResultSet这三个数据库资源,但没有在使用完毕后关闭它们。这些资源如果不及时释放,会持续占用数据库连接池的配额,最终导致连接耗尽,抛出SQLException(比如连接超时、连接池已满)。
修复方案:使用Java 7+支持的try-with-resources语法,它会自动关闭所有实现AutoCloseable接口的资源,不用手动写finally块:
try (PreparedStatement ps = connection.prepareStatement(sql); ResultSet rs = ps.executeQuery()) { // 这里写你的查询遍历逻辑 } catch (SQLException ex) { // 处理数据库异常,比如给用户提示或打印日志 JOptionPane.showMessageDialog(null, "数据库操作出错:" + ex.getMessage()); ex.printStackTrace(); }
注意:如果connection是从连接池获取的,用完后也要记得关闭(或者交给连接池自动管理,具体看你的连接获取逻辑)。
3. 空指针异常隐患
如果ut.getText()或者pt.getText()返回null(比如文本框未输入内容且初始值为null),直接调用equals()方法会抛出NullPointerException。
修复方案:有两种常用的规避方式:
- 把数据库查询到的常量放在
equals()前面,即使输入为null也不会报错:if (rs.getString("uname").equals(ut.getText())) { // ... } - 先判断输入内容不为
null,再进行比较:String inputUname = ut.getText(); String inputPwd = pt.getText(); if (inputUname != null && inputPwd != null) { // 执行后续的遍历比较逻辑 }
4. 未处理登录失败的场景
你的代码只处理了“找到匹配用户”的成功情况,但如果遍历完所有用户都没匹配上,没有任何提示,用户会完全不知道登录失败的原因,甚至可能误以为程序卡住了。
修复方案:添加一个标记变量,遍历结束后判断标记状态,给出对应的提示:
boolean loginSuccess = false; // 先去除输入内容的首尾空格,避免因空格导致匹配失败 String inputUname = ut.getText().trim(); String inputPwd = pt.getText().trim(); try (PreparedStatement ps = connection.prepareStatement(sql); ResultSet rs = ps.executeQuery()) { while(rs.next()) { if (inputUname.equals(rs.getString("uname")) && inputPwd.equals(rs.getString("pwd"))) { JOptionPane.showMessageDialog(null,"You have successfully logged in!"); sf second = new sf(); second.setVisible(true); loginSuccess = true; break; // 找到匹配用户后直接跳出循环,没必要继续遍历 } } // 遍历结束后判断是否登录成功 if (!loginSuccess) { JOptionPane.showMessageDialog(null,"Username or password is incorrect!"); } } catch (SQLException ex) { JOptionPane.showMessageDialog(null,"Database error: " + ex.getMessage()); ex.printStackTrace(); }
5. 缺少完整的异常捕获逻辑
你的代码只有try块,没有对应的catch或finally块,如果数据库操作抛出SQLException(比如连接失败、SQL语法错误),会直接导致程序崩溃,没有任何错误提示。
修复方案:一定要添加catch (SQLException ex)块,捕获并处理数据库异常,同时给用户友好的错误提示,方便排查问题。
内容的提问来源于stack exchange,提问作者bleedblue30

