當我將結果集中的值放入地圖中時,我在下面代碼的顯示行中得到空指針異常,它有時會工作很多次,但有時它正在拋出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)從這一行我無法弄清楚方法getConfiguration中的哪一行是495 –
我在行旁邊添加了一條註釋throw NPE(line 495) –
如果這是完整且正確的堆棧跟蹤,則NPE發生在其中一個'getString()'調用中。你可以重寫那段以在'map.put()'前執行'getString()'調用,並將這些值存儲在臨時的'String's中,這樣你就可以看到哪一個失敗了? –