Я выполняю запрос в Sybase ASE, который создает ResultSet, который я затем просматриваю и записываю в файл. Иногда это вызывает ошибку NullPointerException, в которой указано, что ResultSet - это null. Однако он сделает это после распечатки одной или двух записей. В других случаях при таком же вводе ошибок я не получу.
Мне не удавалось постоянно выдавать эту ошибку. Сообщение об ошибке указывает на строку:
output.print(rs.getString(1));
Похоже, что это происходит, когда по какой-то причине выполнение запроса занимает немного больше времени. До сих пор возврат набора записей был очень небольшим (от 4 до 7 записей). Иногда мне приходится запускать приложение 3 или 4 раза, и тогда ошибки просто прекращаются, как будто запрос «нагревается». Я запустил запрос вручную, и проблем с производительностью, похоже, нет.
Еще раз спасибо!




Надеюсь, у вас все будет хорошо, я имею в виду после вызова rs.next ().
По спец. в любом случае объект ResultSet никогда не должен быть ноль. Даже если записей не найдено. Публикация фрагмента кода и трассировки стека определенно поможет нам дать вам лучший ответ.
Обновлено: Поскольку ошибка указывает на эту строку. Возможно, он вызвал метод нанизывать() в строке ноль, что вызвало исключение NullPointerException. Не уверен, что этого не происходит при стандартном выводе (System.out.println ()), если переданный аргумент имеет тип String. Но вы используете output.print (), поэтому я не уверен в этом. Он может вызывать нанизывать() для переданного аргумента String, за сценой.
Я не знаю, что это за тип вывода, но я сомневаюсь, что какой-либо метод, которому передается String, снова вызовет toString для этого объекта
Ваше сомнение верно относительно System.out.println (). Но я здесь не уверен. Отредактировал пост в соответствии со сценарием. Спасибо, Хемал.
Вы уверены, что это 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 ()) {
// читаем материал
}
если все еще сохраняется, будет посоветовать проверить прочитанное значение на ноль.
Я считаю, что Тим ищет способ решить проблему, а не пытается ее обойти.
Это не обходной путь. Это поможет ему определить конкретные значения, которые станут нулевыми. Я считаю, что это способ начать.
Какой тип output? Обрабатывает ли метод output.printnull?
Попробуйте проверить, является ли rs.getObject(1) нулевым перед вызовом output.print(rs.getString(1))
Я не думаю, что rs.getObject () стоит попробовать. Публикация трассировки стека будет работать лучше всего.
Соединение все еще активно? Вы используете пул соединений?
Посмотрите, можете ли вы включить ведение журнала отладки для этого драйвера JDBC.
Посмотрите, сможете ли вы обновить драйвер до новой версии.
Я нашел решение этой проблемы - соединение с базой данных закрывалось слишком рано. Я не понимал, что как только соединение db будет закрыто, указатель записи окажется нулевым - я думал, что набор результатов будет в системной памяти.
Решение состоит в том, чтобы закрыть соединение после завершения цикла while (rs.next ()).
Еще раз спасибо.
Мне интересно, может ли это быть проблема с потоками. Ваше приложение многопоточное? Вы запускаете его на многоядерном компьютере?