【问题标题】:Try-catch ignoring the assignment of a variable when executing an SQL queryTry-catch 在执行 SQL 查询时忽略变量的分配
【发布时间】:2018-09-02 11:21:45
【问题描述】:

这段代码使用 SQL 查询返回某个表中有多少条目。

public int countAmountOfEntries() {
    int amount;
    try (Connection conn = DriverManager.getConnection(Connection.JDBC_URL); 
            PreparedStatement query = conn.prepareStatement("SELECT COUNT(*) FROM Table")) {
        try (ResultSet rs = query.executeQuery();) {
            if (rs.next()) {
                amount = rs.getInt("COUNT(*)");
            }
        }
    } catch (SQLException ex) {
        throw new RuntimeException(ex);
    }
    return amount;
}

这应该返回除0 之外的任何int。将变量初始化为0 将导致NullPointerException 被抛出,因为我使用它的返回值来设置数组的长度。在另一个类中使用相同的代码会返回它应该返回的 int。我试过为COUNT(*) 使用别名,但无济于事。

直接在 MySQL 中运行查询也会返回 int。我已经尝试删除嵌套尝试(它已经过时了,因为我知道如果没有人弄乱我的数据库,它不会引发异常)。

【问题讨论】:

  • “过时了,因为我知道它不会抛出异常”——你不会,这就是为什么它永远不会“过时”。
  • 我的措辞很糟糕。程序中的任何内容都不会改变该表,它只是被读取的。我向其他 3 个有权访问该数据库的人给出了具体指示,不要更改该表中的任何内容,并且我会定期检查它。不过,我明白你的意思,如果有人要改变它,就会出现问题。我这样做主要是为了看看它是否会做任何事情,但它没有。

标签: java mysql sql oop


【解决方案1】:

你在使用之前注册了JDBC驱动吗?

Class.forName("com.mysql.jdbc.Driver");

连接时是否需要提供用户名/密码?

DriverManager.getConnection(url, user, pass);

您是否自己创建了一个Connection 类,它会覆盖打开连接时返回的Connection 类。我问这个的原因是因为您使用Connection.JDBC_URL 检索要连接的URL,这(据我所知)不在Connection 类中。

是否已经打开了一个连接,而您的数据库只允许打开 1 个连接?

注意:在返回之前不要忘记关闭结果集、语句和连接:

rs.close();
query.close();
conn.close();

除此之外,重构你的函数,因为没有 catch 的尝试根本没有帮助。

【讨论】:

  • 我已经删除了内部tryConnection 类应该完全没问题,因为它使用不同的方法可以正常工作。正如我所说,最奇怪的是它在不同的类中使用时确实有效。这意味着问题出在类本身,但奇怪的是,其他一切都正常。
  • 请尝试在此函数顶部添加行Class.forName一次。因为类加载器的缓存可能同时被垃圾收集。或者也许这段代码在Class.forName 被执行一次之前就被执行了?
  • try 块已经在关闭结果集、语句和连接。它不应该被删除。
  • 我自己创建了 Connection 类,属性为public static final String JDBC_URL = "jdbc:mysql:/hostname?user=username&password=mypassword"。它之前工作正常,只有在添加一个方法后,其他方法才停止工作。添加的方法在其他方法中用于为数组的长度提供一个 int。我会尝试运行没有最后一个的方法。
【解决方案2】:

这看起来很奇怪:

amount = rs.getInt("COUNT(*)");

试试这个

amount = rs.getInt(1);

【讨论】:

  • 我尝试过同时使用索引和别名,但似乎不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
相关资源
最近更新 更多