首页 > 解决方案 > 从表中收集数据时无法修复 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();

谁能让我知道如何解决这个问题?

标签: javajdbc

解决方案


推荐阅读