You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JDBC从PostgreSQL获取数据填充二维Double数组问题

修复JDBC获取PostgreSQL结果集生成二维Double数组的问题

我看了你的代码,发现几个关键问题导致无法正确生成目标二维数组,咱们一步步来解决:

核心问题分析

  • 只保留了最后一行数据:在while(r.next())循环里,你每次都会把intermediateArray替换成当前行的分割结果,循环结束后只存了最后一行的内容,前面的行都被覆盖了。
  • 解析逻辑位置错误:你把字符串转Double数组的代码放在了循环外面,只处理了最后一行的数据,没有逐行解析并填充到二维数组里。
  • 字符串分割的空格问题:你的结果集里逗号后面有空格(比如"501.511346, 503.472045..."),直接用,分割会导致部分元素带空格,转Double时会抛出NumberFormatException。
  • 资源未正确关闭:没有用try-with-resources自动关闭Connection、PreparedStatement和ResultSet,容易造成连接泄漏。

修正后的代码

public double[][] getMatrix(int x, int y) {
    int row = getRowDim(x, y);
    int col = getColDim(x, y);
    double[][] matrix = new double[row][col];
    
    // 使用try-with-resources自动关闭资源,避免泄漏
    try (Connection conn = dataSource.getConnection();
         PreparedStatement p = conn.prepareStatement(getMatrix)) {
        
        p.setInt(1, x);
        p.setInt(2, y);
        
        try (ResultSet r = p.executeQuery()) {
            int currentRow = 0;
            while (r.next() && currentRow < row) {
                String px = r.getString("prices");
                // 用",\\s*"分割,匹配逗号和后面的任意空格,避免元素带空格
                String[] intermediateArray = px.split(",\\s*", -1);
                
                // 逐列解析当前行的字符串为Double
                for (int j = 0; j < col && j < intermediateArray.length; j++) {
                    // 处理空字符串的情况,避免NumberFormatException
                    if (!intermediateArray[j].isEmpty()) {
                        matrix[currentRow][j] = Double.parseDouble(intermediateArray[j]);
                    } else {
                        // 可以根据需求设置默认值,比如0.0
                        matrix[currentRow][j] = 0.0;
                    }
                }
                currentRow++;
            }
        }
    } catch (SQLException e) {
        logger.error("***** SQL EXCEPTION ****", e); // 记得打印异常栈,方便排查
    } catch (NumberFormatException e) {
        logger.error("***** Number Format Exception when parsing prices ****", e);
    }
    
    return matrix;
}

关键修改说明

  1. 逐行处理结果集:把解析逻辑放到while(r.next())循环内部,每读取一行就解析成Double数组并填充到matrix的对应行,用currentRow跟踪当前填充的行索引。
  2. 修复分割逻辑:用,\\s*作为分割符,自动去掉逗号后面的空格,确保每个元素都是干净的数字字符串。
  3. 异常处理增强:新增NumberFormatException捕获,同时在日志里打印异常栈,方便排查具体哪一行哪一列出了问题。
  4. 资源自动管理:使用try-with-resources语法,Connection、PreparedStatement、ResultSet会在代码块结束后自动关闭,避免数据库连接泄漏。
  5. 边界检查:增加currentRow < row和j < col的判断,防止数组越界(比如结果集行数/列数和预期的row/col不一致时)。

这样修改后,就能正确把结果集的每一行都解析成Double数组,填充到目标二维数组里了。

内容的提问来源于stack exchange,提问作者Andrew Fox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:41:53