2011-11-09 78 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作爲「沒有價值」是非常好的,應該這樣對待。