首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当有更多行时执行ArrayIndexOutOfBoundsException时执行resultSet.next()

当有更多行时执行ArrayIndexOutOfBoundsException时执行resultSet.next()
EN

Stack Overflow用户
提问于 2019-05-11 05:58:51
回答 3查看 1.4K关注 0票数 0

我正在试图查询一个表,该表中有一个包含文本的长raw()类型的数据。我需要将这些数据导出到一个平面文件。对于给定的id,我看到表中有14行。我使用JDBC连接获取数据,当使用ResultSet获取数据时,我将在第13行获取ArrayIndexOutOfBoundsException。不知道为什么会发生这个问题。

长原始列中的数据可能很大。我怀疑它无法获取所有现有的数据。我可能也错了。在这种情况下,当ArrayIndexOutOfBoundsException发生时,我找不到很多信息。完整的代码如下-

代码语言:javascript
复制
import java.io.*;
import java.sql.*;
import java.util.ArrayList;


public class TestMain {

    private static String URL = "jdbc:oracle:thin:@localhost:8080:xe";
    private static String USER_NAME = "scott";
    private static String PASSWORD = "tiger";

    public static void main(String[] args) throws SQLException, IOException {

        Connection newConnection = getNewConnection();
        BufferedWriter bw = new BufferedWriter(new FileWriter("./extractedFile/RawDataFile.txt"));
        PreparedStatement extractableRowCount = getExtractableRowCount(newConnection, (long)34212);
        ResultSet foundCountRs = extractableRowCount.executeQuery();
        foundCountRs.next();
        int foundCount = foundCountRs.getInt(1);
        //`here I get 14 as the count`
        System.out.println("Available rows for id:: 34212 are "+foundCount);
        foundCountRs.close();
        extractableRowCount.close();
        PreparedStatement fetchBinaryQueryStatement = getExtractableRow(newConnection, (long)34212);
        ResultSet fetchedRowsRs = fetchBinaryQueryStatement.executeQuery();

        int i=0;
        while (fetchedRowsRs.next()) {
            i++;
            //`I see outputs upto i=13, and then I get ArrayIndexOutOfBoundsException 
            System.out.println("i = " + i);
            String userName = fetchedRowsRs.getString("user_name");
            InputStream savedTextData = fetchedRowsRs.getBinaryStream("saved_text");

            bw.write(userName + ":: ");
            int len = 0;
            if (savedTextData != null) {
                while ((len = savedTextData.read()) != -1) {
                    bw.write((char) len);
                    bw.flush();
                }
            }
            fetchedRowsRs.close();
            fetchBinaryQueryStatement.close();

        }
        bw.close();

    }

    public static Connection getNewConnection() throws SQLException {

        DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
        return DriverManager.getConnection(URL, USER_NAME, PASSWORD);

    }

    public static PreparedStatement getExtractableRow(Connection connection, Long id) throws SQLException {
        PreparedStatement statement = connection.prepareStatement("SELECT user_name, saved_text FROM user_email_text_data where id = ?");
        statement.setLong(1, id);
        return statement;
    }

    public static PreparedStatement getExtractableRowCount(Connection connection, Long id) throws SQLException {
        PreparedStatement statement = connection.prepareStatement("SELECT count(1) FROM user_email_text_data where id = ?");
        statement.setLong(1, id);
        return statement;
    }

}

错误的完整堆栈跟踪:

代码语言:javascript
复制
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8
    at oracle.jdbc.driver.T4CMAREngineNIO.buffer2Value(T4CMAREngineNIO.java:814)
    at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalUB2(T4CMAREngineNIO.java:577)
    at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalSB2(T4CMAREngineNIO.java:557)
    at oracle.jdbc.driver.T4CMAREngine.processIndicator(T4CMAREngine.java:1573)
    at oracle.jdbc.driver.T4CMarshaller$StreamMarshaller.unmarshalOneRow(T4CMarshaller.java:179)
    at oracle.jdbc.driver.T4CLongRawAccessor.unmarshalOneRow(T4CLongRawAccessor.java:159)
    at oracle.jdbc.driver.T4CTTIrxd.unmarshal(T4CTTIrxd.java:1526)
    at oracle.jdbc.driver.T4CTTIrxd.unmarshal(T4CTTIrxd.java:1289)
    at oracle.jdbc.driver.T4C8Oall.readRXD(T4C8Oall.java:850)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:543)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226)
    at oracle.jdbc.driver.T4CPreparedStatement.fetch(T4CPreparedStatement.java:1023)
    at oracle.jdbc.driver.OracleStatement.fetchMoreRows(OracleStatement.java:3353)
    at oracle.jdbc.driver.InsensitiveScrollableResultSet.fetchMoreRows(InsensitiveScrollableResultSet.java:736)
    at oracle.jdbc.driver.InsensitiveScrollableResultSet.absoluteInternal(InsensitiveScrollableResultSet.java:692)
    at oracle.jdbc.driver.InsensitiveScrollableResultSet.next(InsensitiveScrollableResultSet.java:406)
EN

回答 3

Stack Overflow用户

发布于 2021-07-14 09:36:13

在使用ojdbc8-12.2.0.1调用ResultSet.next()时,我得到了完全相同的异常。

代码语言:javascript
复制
java.lang.ArrayIndexOutOfBoundsException: 8
at oracle.jdbc.driver.T4CMAREngineNIO.buffer2Value(T4CMAREngineNIO.java:814)
at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalUB2(T4CMAREngineNIO.java:577)
at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalSB2(T4CMAREngineNIO.java:557)
at oracle.jdbc.driver.T4CMAREngine.processIndicator(T4CMAREngine.java:1573)
at oracle.jdbc.driver.T4CMarshaller$StreamMarshaller.unmarshalOneRow(T4CMarshaller.java:179)
at oracle.jdbc.driver.T4CLongRawAccessor.unmarshalOneRow(T4CLongRawAccessor.java:159)
at oracle.jdbc.driver.T4CTTIrxd.unmarshal(T4CTTIrxd.java:1526)
at oracle.jdbc.driver.T4CTTIrxd.unmarshal(T4CTTIrxd.java:1289)
at oracle.jdbc.driver.T4C8Oall.readRXD(T4C8Oall.java:850)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:543)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:226)
at oracle.jdbc.driver.T4CPreparedStatement.fetch(T4CPreparedStatement.java:1023)
at oracle.jdbc.driver.OracleStatement.fetchMoreRows(OracleStatement.java:3353)

当我将驱动程序版本升级到ojdbc8-18.3.0.0.时,异常消失了。

更新JDBC驱动程序可能值得一试,如果任何人都发现自己处于相同的情况下。

票数 3
EN

Stack Overflow用户

发布于 2019-05-12 13:26:55

下面的行位于外部while循环的末尾,但是它们需要在循环之后执行,因为您不能关闭结果集对象,然后调用next()

代码语言:javascript
复制
fetchedRowsRs.close();
fetchBinaryQueryStatement.close();
票数 0
EN

Stack Overflow用户

发布于 2019-05-11 06:05:43

因为数组的大小是14,所以最后一个索引是13,因为它是从0开始的,所以您访问的索引值大于数组的大小,这会给ArrayOutOfBound异常。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56087648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档