Помогите разобратся с ошибкой java.sql.SQLException: column 2 out of bounds [1,1]

175
19 апреля 2018, 12:50

Есть такая таблица SQLite

col1  col2  col3  col4
row1  row1  row1  row1
row2  row2  row2  row2
row3  row3  row3  row3
row4  row4  row4  row4
row5  row5  row5  row5

И есть небольшая программка на Java NetBeans, которая должна считывать всю БД и записывать её в jTable. Но она делает это очень криво когда из БД удаляешь все строки, и выдаёт следующую ошибку когда в таблицу добавлены строки:

java.sql.SQLException: column 2 out of bounds [1,1]
at org.sqlite.core.CoreResultSet.checkCol(CoreResultSet.java:84)
at org.sqlite.core.CoreResultSet.markCol(CoreResultSet.java:97)
at org.sqlite.jdbc3.JDBC3ResultSet.getString(JDBC3ResultSet.java:436)

Код получения данных из БД:

public static String[] [] getAllData(Connection con) {
    String[] [] res;
    int i = 1;
    int j = 1;
    res = new String[countRows(con)] [columnNames(con).size()];
    stmt = con.createStatement();
    query = "SELECT * FROM class;";
    rs = stmt.executeQuery(query);
    rs.next();
    while(i<columnNames(con).size()) {
        while(j<countRows(con)) {
            res [j] [i] = rs.getString(j);
            j++;
        }
        i++;
    }
    return res;
}

Код для записи в таблицу:

int i = 1;
int j = 1;
String[] [] res = DBController.getAllData(con);
while(i<rows) {
    while(j<cols) {
        dtm.setValueAt(res [j] [i], j, i);
        j++;
    }
    i++;
}

Пожалуйста, помогите хотя-бы понять чем эта ошибка вызвана.

Answer 1

У Вас неверная обработка данных в ResultSet.
Принятый паттерн обработки выглядит так:

    public static String[][] getAllData(Connection con) {
        int i = 0;
        int j = 0;
        String[][] res = new String[countRows(con)][columnNames(con).size()];
        try (Statement stmt = con.createStatement();) {
            String query = "SELECT * FROM class;";
            try (ResultSet rs = stmt.executeQuery(query);) {
                while(rs.next()) {
                    while (i < columnNames(con).size()) {
                        while (j < countRows(con)) {
                            res[j][i] = rs.getString(j + 1);
                            j++;
                        }
                        i++;
                    }
                }
                return res;
            }
        }
    }

Вам необходимо проводить обработку только когда строки есть.
Очень полезный оригинальный материал
Так же информацию о столбцах можно получить методом

    rs.getMetaData()
READ ALSO
Запуск автотестов с TestContainer в GitLab

Запуск автотестов с TestContainer в GitLab

Не запускаются тесты с TestContainer в GitLab

366
Как получить principalName и другие параметры из WebSphere?

Как получить principalName и другие параметры из WebSphere?

На WebSphere развернуто приложениеИдентифицирующая среда - AD

157
RecyclerView. Прогресс загрузки

RecyclerView. Прогресс загрузки

Мне нужно показывать прогресс загрузки в элементе RecyclerViewЕстественно, как только я выйду в другую Activity или закрою эту, прогресс показываться...

195
Проблема с запросом

Проблема с запросом

Есть 3 таблицы (упрощённо):

256