Смотрите здесь:
public static Statement state() {
try{
connection = UniqueConnection.getInstance();
statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
}
catch(Exception e) { e.printStackTrace(); }
return statement;
}
Ваша обработка исключений плохая.Если UniqueConnection.getInstance()
или connection.createStatement()
выдает исключение, то код немедленно перейдет в блок catch
, тем самым не затрагивая переменную statement
, которая, таким образом, остается null
.Поскольку вы просто печатаете трассировку стека на стандартный вывод и продолжаете поток кода вместо того, чтобы выдавать полноценное исключение, код продолжается в строке return statement
.Поскольку statement
по-прежнему null
, вы получите NullPointerException
всякий раз, когда пытаетесь вызвать метод для возвращаемого значения.
resultat = state().executeQuery(SqlSinRef); // state() returns null, so NPE!
Вам необходимо прочитать трассировку стека, которая печатается внутриcatch
предложение для реальной причины проблемы, а не той, которая вызвана NPE.Или, что еще лучше, создайте реальное исключение, чтобы код немедленно остановился вместо продолжения потока и работы с переменными, которые, возможно, null
.
Исправили все ваши catch
предложения, которые просто поглощают исключение.и печатать трассировку, чтобы вместо этого выдать реальное исключение:
catch(SomeException e) { throw e; }
Или, лучше, просто удалить их и использовать вместо этого предложение throws
в объявлении метода.Блок try
следует использовать только тогда, когда вы можете обработать исключение разумным способом (т. Е. Выбрать альтернативный путь, отобразить экран ошибки для конечного пользователя и прервать код и т. Д .; просто напечатайте трассировку ипродолжение с null
переменными определенно не является правильным альтернативным путем), или всякий раз, когда вы хотите использовать finally
блок для закрытия и освобождения дорогих ресурсов.1037 * a SQLException: no suitable driver
, потому что загрузка драйвера не удалась с ClassNotFoundException org.postgresql.Driver
, и вы исключили это исключение таким же образом.
Не связано с проблемой: естьболее серьезные проблемы с вашим кодом.
Вы объявили дорогие ресурсы базы данных, такие как соединение, оператор и набор результатов, как static
переменные класса.Это не потокобезопасно!Он будет хорошо работать в приложении, которое использует их один раз , а затем немедленно выключается.Но он с треском провалится в приложении, которое использует их несколько раз во время выполнения, например в веб-приложении.
Вы не не хотите использовать «уникальное соединение» в течение всего срока службы веб-приложения.Средняя база данных автоматически закроет ее, если она будет открыта слишком долго.Вам необходимо получить и закрыть соединение, выписку и набор результатов в кратчайшие сроки.Если вы хотите улучшить производительность соединения, вам следует вместо этого использовать пул соединений.
Ваш уровень доступа к данным очень тесно связан с уровнем представления.Вы строите какой-то фрагмент HTML внутри класса доступа к базе данных, а не внутри файла JSP.
Исправьте это соответствующим образом.Вы можете найти некоторые примеры в ответах на следующие вопросы: