Драйвер MySQL Connector / J не должен выдавать NullPointerException
в этой ситуации, но вместо этого должен был выдать SQLException
, что результирующий набор не находится в строке. Это ошибка.
Однако метод wasNull()
предназначен для проверки, было ли последнее значение примитива , считанное из набора результатов, null
(как примитивы). не поддерживает null
, в то время как столбец базы данных поддерживает):
Сообщает, было ли значение последнего прочитанного столбца SQL NULL
. Обратите внимание, что сначала вы должны вызвать один из методов получения в столбце, чтобы попытаться прочитать его значение, а затем вызвать метод wasNull
, чтобы проверить, было ли прочитанное значение SQL NULL
.
* 1020. * Есть три проблемы с вашим кодом:
- Вам всегда нужно использовать
rs.next()
, чтобы проверить, есть ли строка (и перейти к этой строке, если она существует), прежде чем вы сможете получить значения. - Вам нужно получить значение (например,
getInt(1)
), прежде чем вы сможете позвонить wasNull()
. - . Вы используете
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);
}
}