2011-11-09 79 views
0

我正在运行使用MySQL数据库的Tomcat WAR。 应用程序将以外语运行,所以我必须将所有数据库字符参数更改为utf8。将数据库编码更改为导致java.lang.NullPointerException的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

和其他的'RuntimeException'一样,这只是你自己代码中的一个bug。请显示'com.horizo​​n.servlet.PageServlet.doMainPageRequest(PageServlet.java:177)' – BalusC

+0

背后的代码所以,'appManager.getAppStringById(11)'返回'null'?换句话说,'execQueryLoadSingleRecord()'方法返回'null'?为什么它返回'null'呢? – BalusC

+0

它得到的数据库条目是空的,因为它应该。所以它不应该返回null?这与任何事情有冲突吗?直到我将数据库的编码从默认的latin1瑞典语更改为UTF8时,空白的db字符串才是问题! –

回答

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作为“没有价值”是非常好的,应该这样对待。