Java NullPointerException при обходе ненулевого набора записей - PullRequest
3 голосов
/ 18 декабря 2008

Я выполняю запрос в Sybase ASE, который выдает ResultSet, который я затем просматриваю и записываю содержимое в файл. Иногда это выдает NullPointerException, утверждая, что ResultSet равно null. Однако это будет сделано после распечатки одной или двух записей. В других случаях с таким же точным вводом я не получу ошибок.

Мне не удалось последовательно выдать эту ошибку. Сообщение об ошибке указывает на строку:

output.print(rs.getString(1));

Похоже, это происходит, когда запрос по какой-то причине выполняется немного дольше. До сих пор набор записей возвращался очень маленьким (от 4 до 7 записей). Иногда мне приходится запускать приложение 3 или 4 раза, тогда ошибки просто прекращаются, как будто запрос «прогревается». Я выполнил запрос вручную, и проблем с производительностью не было.

Еще раз спасибо!

Ответы [ 6 ]

3 голосов
/ 18 декабря 2008

Вы уверены, что ResultSet равен null, а не rs.getString (1)?

Это типичный Java-запрос

preparedStatement.setLong(1, primaryKey);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next())
{
  String foo = rs.getString(1);
  if (foo != null)
    ...
}
2 голосов
/ 18 декабря 2008

Надеюсь, у вас все получится, я имею в виду после вызова rs.next () .

Согласно спецификации. в любом случае объект ResultSet никогда не должен иметь значение null . Даже если никаких записей не найдено. Размещение фрагмента кода и трассировки стека определенно поможет нам дать вам лучший ответ.

EDIT: Так как ошибка указывает на эту строку. Это может быть вызов метода toString () для null String, что вызвало исключение NullPointerException. Не уверен, однако, что это не происходит в стандартном выводе (System.out.println ()), если переданный аргумент имеет тип String. Но вы используете output.print () , поэтому я не уверен в этом. Это может быть вызов toString () для переданного аргумента String позади сцены.

1 голос
/ 18 декабря 2008

Какой тип output? output.print метод обрабатывает null?

Попробуйте проверить, является ли rs.getObject(1) нулевым, перед вызовом output.print(rs.getString(1))

0 голосов
/ 21 января 2009

Я нашел решение этой проблемы - соединение с базой данных закрывалось слишком рано. Я не осознавал, что, как только соединение с БД будет закрыто, указатель записи окажется нулевым - я думал, что набор результатов будет в системной памяти.

Решение состоит в том, чтобы закрыть соединение после завершения цикла while (rs.next ()).

Еще раз спасибо.

0 голосов
/ 18 декабря 2008

Соединение все еще активно? Вы используете пул соединений?

Посмотрите, можете ли вы включить ведение журнала отладки для этого драйвера JDBC.

Проверьте, можете ли вы обновить драйвер до новой версии.

0 голосов
/ 18 декабря 2008

попробуйте обернуть материал для доступа к данным, как:

if (rs! = Null && rs.next ()) {

// читать материал

}

если все еще сохраняется, советует проверить значение считывания для самого нуля.

...