Я получаю исключение Null указателя в указанной строке в следующем коде, когда я помещаю значения из набора результатов в карту, он работает чаще всего, но иногда он бросает NPE, это приложение типа службы, которое работает в фоновом режиме, и каждый метод открывает соединение с базой данных и закрывает его после использования. Для каждого метода существует синхронизированная блокировка, поэтому при подключении к БД не возникает конфликта.Неожиданный NPE, брошенный при попытке поставить результаты запроса на карту
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() здесь просто создает соединение с db-
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)
Я бег запроса один раз в каждом цикле и чтении результаты сразу же после этого. Что я должен сделать, чтобы преодолеть это?
com.twora.entryexit.db.DatabaseAccess.getConfiguration (DatabaseAccess.java:495) Из этой строки я не могу понять, какая строка 495 в методе getConfiguration –
Я добавил комментарий рядом с линией, бросающей NPE (строка 495) –
Если это полная и правильная трассировка стека, NPE происходит в одном из вызовов 'getString()'. Можете ли вы переписать этот раздел для выполнения 'getString()' вызовов перед 'map.put()' и хранить значения во временном 'String', чтобы вы могли видеть, какой из них терпит неудачу? –