【问题标题】:exception occurs when I want to retrieve data that is not present in the database [duplicate]当我想检索数据库中不存在的数据时发生异常[重复]
【发布时间】:2021-10-09 13:24:50
【问题描述】:

我使用 JDBC 将数据存储在我的 SQL 数据库中。当我想检索数据时,它会给出一个异常。检索数据的代码是

    public Stoke getCurrantStokeByBarcode(String barcode)
    {
        String query = "SELECT * FROM stoke WHERE barcode =?";
        try {
            PreparedStatement preparedStatement = connection.prepareStatement(query);
            preparedStatement.setString(1,barcode);
            ResultSet resultSet = preparedStatement.executeQuery();
            resultSet.absolute(1);
            if (resultSet != null)
            {
                if (resultSet.getString(1).equals(barcode)) {
                    Stoke item = new Stoke(resultSet.getString(2),resultSet.getString(4),
                            resultSet.getString(3),resultSet.getString(1)
                            ,resultSet.getString(5),resultSet.getString(7),
                            resultSet.getString(6),resultSet.getString(8)
                            ,resultSet.getString(9));
    
                    return item;
                }
            }
            else
                return null;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return null;
    }

我还对这个异常进行了检查,但它仍然会发生。如何删除此异常?

    java.sql.SQLException: Illegal operation on empty result set.
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:861)
        at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:780)
        at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5204)
        at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5127)
        at sample.Database.DatabaseHandler.getCurrantStokeByBarcode(DatabaseHandler.java:79)
        at sample.Controller.Add_StokeController.onBarcodeScan(Add_StokeController.java:218)
        at jdk.internal.reflect.GeneratedMethodAccessor10.invoke(Unknown Source)

【问题讨论】:

    标签: java mysql sql jdbc


    【解决方案1】:

    要开始从您的结果集中读取数据或让第一行(如果存在)成为您的当前行,您应该首先调用next

    您可以修改您的代码

    if (resultSet != null)
    

    if (resultSet != null && resultSet.next())
    

    因为next() 将返回一个boolean 值,指示是否有要读取的行。如果没有结果,则根据您现有的逻辑,该函数将返回 null 并且不会尝试从空结果集中读取。

    此外,resultSet.absolute(1); 不是必需的,我建议您删除它。

    【讨论】:

    • resultSet != null 检查不是必需的:resultSet 永远不会为空,因为当调用不产生结果集的语句时,executeQuery 需要抛出 SQLException (不产生行的查询有一个结果集,一个空的结果集)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 2021-06-29
    • 2013-09-26
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2014-05-28
    相关资源
    最近更新 更多