Обработка пустых значений в java Resultset с помощью wasnull () - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь обработать ноль в наборе результатов, получая нижеупомянутую ошибку

Код: здесь запрос возвращает ноль, в случае нулевой версииNo должно быть 0

int versionNo = 0;
        try {
            ResultSet res = stmt.executeQuery(query);
            if (res.wasNull()) {
                versionNo = 0;
            } else {
                while (res.next()) {
                    versionNo = res.getInt(1);
                }
            }

Ошибка: java .lang.NullPointerException at com. mysql .cj.jdb c .result.ResultSetImpl.wasNull (ResultSetImpl. java: 2496)

1 Ответ

3 голосов
/ 04 февраля 2020

Драйвер MySQL Connector / J не должен выдавать NullPointerException в этой ситуации, но вместо этого должен был выдать SQLException, что результирующий набор не находится в строке. Это ошибка.

Однако метод wasNull() предназначен для проверки, было ли последнее значение примитива , считанное из набора результатов, null (как примитивы). не поддерживает null, в то время как столбец базы данных поддерживает):

Сообщает, было ли значение последнего прочитанного столбца SQL NULL. Обратите внимание, что сначала вы должны вызвать один из методов получения в столбце, чтобы попытаться прочитать его значение, а затем вызвать метод wasNull, чтобы проверить, было ли прочитанное значение SQL NULL.

* 1020. * Есть три проблемы с вашим кодом:
  1. Вам всегда нужно использовать rs.next(), чтобы проверить, есть ли строка (и перейти к этой строке, если она существует), прежде чем вы сможете получить значения.
  2. Вам нужно получить значение (например, getInt(1)), прежде чем вы сможете позвонить wasNull().
  3. . Вы используете wasNull(), чтобы назначить 0 для versionNo, что совершенно не нужно, потому что getInt вернет 0, если значение столбца равно NULL (см. getInt: "Возвраты: значение столбца; если значение SQL NULL, возвращаемое значение равно 0 ")

Чтобы исправить свой код, вам нужно сделать что-то вроде:

try (ResultSet res = stmt.executeQuery(query)) {
    while (res.next()) {
        versionNo = res.getInt(1);
        if (res.wasNull()) {
            // whatever you want to, other than setting versionNo to 0
        }
    }
}

Имейте в виду, что если у вас есть несколько строк, это будет эффективно возвращать значение последней строки.

С другой стороны, если вы хотите проверить, нет ли строки, то вы должны показать ld сделать что-то вроде:

Опция 1: эквивалентная логика c

try (ResultSet res = stmt.executeQuery(query)) {
    if (res.next()) {
       do {
           versionNo = res.getInt(1);
       } while (res.next());
    } else {
        // no rows
    }
}

Опция 2: инициализировать versionNo значением по умолчанию. Если вы заинтересованы только в инициализации versionNo в ноль, вы также можете просто сделать это перед обработкой строк.

try (ResultSet res = stmt.executeQuery(query)) {
    versionNo = 0;
    while (res.next()) {
        versionNo = res.getInt(1);
    }
}
...