java - 从表中收集数据时无法修复 java.lang.NullPointerException
问题描述
我正在尝试同时从两个数据库中检索数据以进行数据比较。要获取两个数据库中存在的表名,我必须读取第三个数据库,其中所有表名都存储在一个表中。下面是获取表名的方法:
public List<String> getChunks() {
List<String> chunkNamesList = new ArrayList<String>();
Connection chunkTableCon = DbManager.getBdMergeConnection();
String[] chunkArray;
try {
PreparedStatement cStmnt = chunkTableCon.prepareStatement(chunkNames);
ResultSet crs = cStmnt.executeQuery();
while(crs.next()) {
chunkArray = crs.getString(1).split("\\.");
chunkNamesList.add("analytics." + chunkArray[1] + "," + crs.getString(1) + ":" + crs.getString(2));
}
chunkTableCon.close();
return chunkNamesList;
} catch(SQLException e) {
e.printStackTrace();
return null;
} catch(Exception e) {
e.printStackTrace();
return null;
}
}
我创建了两个线程,它们将从集合中读取数据:chunkNamesList
用于分析。下面是我如何创建两个线程:
new Thread(new Runnable() {
@Override
public void run() {
try {
gpTableCount = getGpTableCount();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
hiveTableCount = getHiveTableCount();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
当我提交 jar 时,方法:getGpTableCount & getHiveTableCount 首先从方法获取表详细信息:getTables(),如下所示:
public Map<String,String> getGpTableCount() throws SQLException {
gpDataMap = new HashMap<String, String>();
gpTableErrs = new HashMap<String, String>();
gpTableList = getChunks();
Iterator<String> keySetIterator_gpTableList = gpTableList.iterator();
Connection gpAnalyticsCon = (Connection) DbManager.getGpConnection();
PreparedStatement gp_pstmnt = null;
..........................
..........................
}
public Map<String, String> getHiveTableCount() throws IOException, SQLException {
hiveDataMap = new HashMap<String, String>();
hiveTableErrs = new HashMap<String, String>();
List<String> hiveTableList = getChunks();
Iterator<String> hiveIterator = hiveTableList.iterator();
Connection hiveConnection = DbManager.getHiveConnection();
PreparedStatement hive_pstmnt = null;
..........................
..........................
}
一旦我提交了 jar,大多数时候我都会进入java.lang.NullPointerException
方法: getGpTableCount() 在行:Iterator<String> keySetIterator_gpTableList = gpTableList.iterator();
除了:
org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:315)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:430)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:356)
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:168)
at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:116)
at com.recordcount.dao.ChunkRecon.getChunks(ChunkRecon.java:82)
at com.recordcount.dao.ChunkRecon.getGpTableCount(ChunkRecon.java:105)
at com.recordcount.dao.ChunkRecon$1.run(ChunkRecon.java:224)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.SocketException: Socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:140)
at org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:109)
at org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:67)
at org.postgresql.core.PGStream.receiveChar(PGStream.java:280)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1916)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:288)
... 8 more
java.lang.NullPointerException
at com.recordcount.dao.ChunkRecon.getGpTableCount(ChunkRecon.java:106)
at com.recordcount.dao.ChunkRecon$1.run(ChunkRecon.java:224)
at java.lang.Thread.run(Thread.java:745)
同样的异常随机发生在以下任一行:
Iterator<String> keySetIterator_gpTableList = gpTableList.iterator();
Iterator<String> hiveIterator = hiveTableList.iterator(); in the method: `getHiveTableCount()`
我将 hiveTableList 和 gpTableList 全局声明为
List<String> hiveTableList = new ArrayList<String>();
List<String> gpTableList = new ArrayList<String>();
异常发生在它们各自方法中的这两行:
Iterator<String> hiveIterator = hiveTableList.iterator();
Iterator<String> keySetIterator_gpTableList = gpTableList.iterator();
谁能让我知道如何解决这个问题?
解决方案
推荐阅读
- vue.js - 如何测试挂载到根目录的 Vue“服务”,通过 Vue.prototype 访问
- c# - 统一解决没有类型信息
- azure - Azure Boards - 定义/管理对工作项创建或修改的访问
- r - 在 R 中聚合和计数数据
- r - 如果另一列显示特定值,如何使用 R 创建一个新列,该列显示 TRUE/FALSE?
- python - 成员数量总是 1 discord.py
- java - JPA 和 Lombok 在循环依赖中导致 StackOverflowError
- python - Python使用给定旋转进行QR分解
- vuejs3 - Vue 3 删除了行内块元素之间的空白
- python - Python openpyxl 在 2 个不同的列范围上应用数字格式