gpt4 book ai didi

java - 尝试将查询结果集放入 map 时抛出意外的 NPE

转载 作者:行者123 更新时间:2023-11-29 11:12:03 24 4
gpt4 key购买 nike

当我将结果集中的值放入映射中时,我在以下代码中显示的行处收到空指针异常,它大多数时候都有效,但有时会抛出 NPE,它是一个运行的服务类型应用程序在后台,每个方法都会打开与数据库的连接并在使用后关闭它。每个方法都有一个synchronized锁,保证连接DB时不会发生冲突。

public Configuration getConfiguration() {
String sql = "SELECT * FROM tbl_settings;";
HashMap<String, String> map = new HashMap<String, String>();

synchronized (_synchObject){
try {
open();
PreparedStatement stmt = (PreparedStatement) conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
>>line 495: map.put(rs.getString("Field"), rs.getString("Value")); //NPE is thrown in this line: 495
}
} catch (SQLException e) {
logger.error(e);
} finally {
try {
close();
} catch (SQLException e) {
logger.error(e);
}
}
return new Configuration(map);
}

这里的 open() 方法只是创建与数据库的连接-

 private void open() throws SQLException {
String connectionString = ConfigSettings.getInstance().getDatabaseConnectionString();
conn = (Connection) DriverManager.getConnection(connectionString);
}

抛出异常 -

Exception in thread "Thread-2" java.lang.NullPointerException
at com.mysql.jdbc.ResultSetImpl.buildIndexMapping(ResultSetImpl.java:683)
at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1042)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5202)
at com.twora.entryexit.db.DatabaseAccess.getConfiguration(DatabaseAccess.java:495)
at com.twora.entryexit.model.Configuration.getInstance(Configuration.java:33)
at com.twora.entryexit.service.runnables.IntervalledService.runSpecific(IntervalledService.java:33)
at com.twora.entryexit.service.runnables.RunningService.run(RunningService.java:38)
at java.lang.Thread.run(Thread.java:745)

我在每次运行中运行一次查询,并在运行后立即读取结果集。我应该怎么做才能克服这个问题?

最佳答案

在结果集中构建三个映射的代码中出现异常,这些映射将列名称和标签映射到查询中的索引。这与 getString 的调用无关。

最有可能发生的情况是您的线程同步有缺陷,并且您有两个线程同时处理同一个结果集对象。发生这种情况是因为结果集来自连接对象,并且您有两个线程同时使用来自同一连接的同一结果集对象。

当在结果集中调用“close”时,该结果集中的映射将被清除。因此,一个线程关闭结果集,而另一个线程仍在使用它。这也解释了为什么它有时会起作用,这完全取决于时机。

我可以在您的代码中看到您用于同步的对象不清楚。您需要确保您没有同时在两个单独的线程中使用相同的连接对象,并且您的同步此时无法执行此操作。

关于java - 尝试将查询结果集放入 map 时抛出意外的 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40393885/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com