数据库编码更改为UTF8导致java.lang.NullPointerException

时间:2011-11-09 18:43:38

标签: java mysql sql utf-8

我正在运行使用MySQL数据库的Tomcat WAR。 应用程序将以外语运行,因此我必须将所有数据库字符参数更改为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为空引起,但它应该......

我应该以另一种方式将其指定为空吗?或者我应该尝试对此进行硬编码?

修改 根据下面评论中的请求,这里是PageServlet.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 个答案:

答案 0 :(得分:1)

根据

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

  

它获取的数据库条目是空的,因为它应该..所以不应该返回null?这与任何事情都有冲突吗?在我将数据库的编码从默认的latin1瑞典语更改为UTF8之前,db字符串为空是没有问题的!

我理解,如果appManager.getAppStringById(11)可能返回null,那根本不是问题,对吧?在这种情况下,您应该在调用getValue()之前检查它。

AppString appString = appManager.getAppStringById(11);

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

至于为什么在更改表的字符集后它返回null;我不知道。也许这只是巧合或对问题的误解。也许您之后添加了getValue()来电,因为您想在EL中使用${appPrefix}而不是${appPrefix.value}。或者你重写execQueryLoadSingleRecord()它返回null而不是空字符串。或者列的默认值可能是null而不是空字符串。或许这是使用的JDBC驱动程序中的错误。谁知道。使用null作为“无价值”是完全正确的,应该这样对待。