Java NullPointerException при обходе ненулевого набора записей

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

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

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

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

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

Мне интересно, может ли это быть проблема с потоками. Ваше приложение многопоточное? Вы запускаете его на многоядерном компьютере?

Alan Moore 18.12.2008 16:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
1
5 159
6

Ответы 6

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

По спец. в любом случае объект ResultSet никогда не должен быть ноль. Даже если записей не найдено. Публикация фрагмента кода и трассировки стека определенно поможет нам дать вам лучший ответ.

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

Я не знаю, что это за тип вывода, но я сомневаюсь, что какой-либо метод, которому передается String, снова вызовет toString для этого объекта

Miserable Variable 18.12.2008 11:32

Ваше сомнение верно относительно System.out.println (). Но я здесь не уверен. Отредактировал пост в соответствии со сценарием. Спасибо, Хемал.

Adeel Ansari 18.12.2008 12:18

Вы уверены, что это 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)
    ...
}

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

если (rs! = null && rs.next ()) {

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

}

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

Я считаю, что Тим ищет способ решить проблему, а не пытается ее обойти.

Alan Moore 18.12.2008 16:50

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

Nrj 19.12.2008 08:08

Какой тип output? Обрабатывает ли метод output.printnull?

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

Я не думаю, что rs.getObject () стоит попробовать. Публикация трассировки стека будет работать лучше всего.

Adeel Ansari 18.12.2008 12:22

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

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

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

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

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

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

Другие вопросы по теме