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

香薰蜡烛管理程序条件判断语句异常问题及代码求助

解决香薰蜡烛产品管理程序中香水名称重复检查的逻辑问题

嘿,我来帮你排查这个问题~从你贴的代码来看,有几个关键问题导致了条件判断异常,咱们一步步梳理:

1. SQL语句的语法错误

你写的SQL末尾多了一个分号:

sql = "SELECT Code_Parfum FROM T_Parfum WHERE Nom_Parfum = \"" + tbxPerfumeName.getText() + "\";; 

这里最后两个分号会导致SQL执行报错,数据库无法正确解析这条语句,这可能是触发异常逻辑的根源之一,得改成一个分号。

2. 严重的SQL注入风险(同时也会引发语法问题)

直接把用户输入的文本拼接进SQL字符串是非常危险的操作,比如如果用户输入的香水名称里包含双引号,会直接破坏SQL语法,导致执行失败。必须改用PreparedStatement来参数化查询,这不仅能避免注入,还能自动处理字符串转义问题。

3. ResultSet游标使用逻辑错误

你先调用了System.out.println(!rs.next());,这已经移动了ResultSet的游标:

  • 如果香水存在,rs.next()返回true,打印false,此时游标已经指向第一条记录;
  • 如果香水不存在,rs.next()返回false,打印true,游标处于末尾。

之后你在if (!rs....里再次调用rs.next()的话,相当于再次尝试移动游标,这时候的返回值和第一次完全无关,自然会导致条件判断混乱,出现“无论真假都执行”的情况。

修正后的完整代码示例

这里给你写一个规范的实现,解决以上所有问题:

try {
    // 1. 使用PreparedStatement参数化查询,避免注入和语法错误
    String sql = "SELECT Code_Parfum FROM T_Parfum WHERE Nom_Parfum = ?";
    PreparedStatement pstmt = conn.prepareStatement(sql);
    // 替换占位符,第一个参数是占位符索引(从1开始),第二个是用户输入的香水名称
    pstmt.setString(1, tbxPerfumeName.getText());
    
    // 2. 执行查询并获取结果集
    ResultSet rs = pstmt.executeQuery();
    
    // 3. 只调用一次rs.next(),把结果存到变量里复用
    boolean isPerfumeExists = rs.next();
    System.out.println(!isPerfumeExists); // 不存在时返回true,存在时返回false
    
    // 4. 基于变量进行逻辑判断
    if (isPerfumeExists) {
        // 香水已存在,执行不允许更新的逻辑,比如提示用户
        System.out.println("该香水名称已存在,无法执行更新!");
    } else {
        // 香水不存在,执行更新数据的逻辑
        System.out.println("香水名称未重复,可以执行更新操作");
        // 这里写你的更新代码...
    }

    // 记得手动关闭资源,或者用下面的try-with-resources自动关闭
    rs.close();
    pstmt.close();
} catch (SQLException e) {
    // 处理数据库异常,比如打印错误信息或提示用户
    e.printStackTrace();
}

进阶优化:使用try-with-resources自动关闭资源

Java 7及以上支持try-with-resources语法,能自动关闭实现了AutoCloseable接口的资源(比如ResultSet、PreparedStatement、Connection),避免资源泄漏:

// 假设getConnection()是你获取数据库连接的方法
try (Connection conn = getConnection();
     PreparedStatement pstmt = conn.prepareStatement("SELECT Code_Parfum FROM T_Parfum WHERE Nom_Parfum = ?");
     ResultSet rs = pstmt.executeQuery()) {
    
    pstmt.setString(1, tbxPerfumeName.getText());
    boolean isPerfumeExists = rs.next();
    
    if (isPerfumeExists) {
        System.out.println("香水名称已存在,拒绝更新");
    } else {
        // 执行更新逻辑
        System.out.println("执行数据更新");
    }
} catch (SQLException e) {
    e.printStackTrace();
}

这样修改后,你的条件判断逻辑就能正常工作啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:18:54