Изменение кодировки базы данных на UTF8 вызывает java.lang.Исключение NullPointerException

#java #mysql #sql #utf-8

#java #mysql #sql #utf-8

Вопрос:

Я запускаю Tomcat WAR, который использует базу данных MySQL. Приложение будет работать на иностранных языках, поэтому мне пришлось изменить все символьные параметры базы данных на utf8.

Одна строка приложения (appPrefix) должна быть пустой (поскольку WAR развернут в корневом каталоге). Это работало хорошо, пока я не создал новую базу данных в UTF8 и не перенес все таблицы.

Теперь я получаю исключение NullPointerException из-за того, что appPrefix пуст:

 java.lang.NullPointerException
com.horizon.servlet.PageServlet.doMainPageRequest(PageServlet.java:177)
com.horizon.servlet.PageServlet.doRequest(PageServlet.java:53)
com.horizon.servlet.PageServlet.doGet(PageServlet.java:33)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
com.horizon.filters.P3PFilter.doFilter(P3PFilter.java:19)
  

Приведенная выше ошибка вызывает сбои во всем приложении.
Все это вызвано тем, что appPrefix пуст, но так и должно быть..

Должен ли я указать его как пустой другим способом? Или я должен попытаться жестко закодировать свой способ обойти это?

РЕДАКТИРОВАТЬ: Согласно запросу в комментарии ниже, вот страница servlet.java:177

 request.setAttribute("appPrefix", appManager.getAppStringById(11).getValue());
  

Это ссылается AppManager.java:

 public static final int APP_STRING_APPLICATION_PREFIX = 11;
  

которое заполняется

 public AppString getAppStringById(int id) {
    AppString string = (AppString) stringCache.get(id);
    if (string == null) {
        String query = "SELECT * FROM app_strings WHERE id = ?";
        List<Object> params = new LinkedList<Object>();
        params.add(id);
        string = execQueryLoadSingleRecord(query, params, new LoadAppString());
        if (string != null) {
            populateCache(stringCache, id, string);
        }
    }

    return string;
}
  

Комментарии:

1. Как и в любом другом случае RuntimeException , это просто ошибка в вашем собственном коде. Пожалуйста, покажите код, лежащий в основе com.horizon.servlet.PageServlet.doMainPageRequest(PageServlet.java:177)

2. Итак, appManager.getAppStringById(11) возвращено null ? Другими словами, execQueryLoadSingleRecord() метод вернул null ? Тогда почему оно возвращается null ?

3. Получаемая запись базы данных пуста, как и должно быть.. Так не должно ли оно возвращать null? Это с чем-нибудь конфликтует? Пустая строка db не была проблемой, пока я не изменил кодировку базы данных на UTF8 с latin1 шведского по умолчанию!

Ответ №1:

Согласно

 request.setAttribute("appPrefix", appManager.getAppStringById(11).getValue());
  

и

Получаемая запись базы данных пуста, как и должно быть.. Так не должно ли оно возвращать null? Это с чем-нибудь конфликтует? Пустая строка db не была проблемой, пока я не изменил кодировку базы данных на UTF8 с latin1 шведского по умолчанию!

Я понимаю, что это вообще не проблема, если appManager.getAppStringById(11) возможно вернуть null , верно? В этом случае вам следует проверить это перед вызовом getValue() .

 AppString appString = appManager.getAppStringById(11);

if (appString != null) {
    request.setAttribute("appPrefix", appString.getValue());
}
  

Что касается того, почему он возвращается null после того, как вы изменили кодировку таблицы; Я понятия не имею. Возможно, это просто большое совпадение или неправильная интерпретация проблемы. Возможно, вы добавили getValue() call позже, потому что хотели использовать ${appPrefix} вместо ${appPrefix.value} в EL или что-то в этом роде. Или, возможно, вы переписали, execQueryLoadSingleRecord() чтобы оно возвращало null вместо пустой строки. Или, возможно, значение столбца по умолчанию null вместо пустой строки. Или, возможно, это ошибка в используемом драйвере JDBC. Кто знает. Использование null в качестве «нет значения» совершенно нормально и должно рассматриваться как таковое.