在 Java Web 開發中,經常需要判斷請求 URL 是否包含查詢參數(如 ?locale=zh_CN)。許多開發者會直接使用 HttpServletRequest.getQueryString() 並配合正則表達式進行匹配,但這樣做容易引發空指針異常或邏輯錯誤。本文將梳理常見錯誤,並給出最佳實踐方案。
if (!(httpServletRequest.getQueryString() == null)) {
String url = httpServletRequest.getQueryString();
boolean flag = url.matches("locale=[a-z]{1,2}_[A-Z]{1,2}");
if (flag) {
String locale = httpServletRequest.getParameter("locale");
MyAcceptHeaderLocaleResolver mhlr = new MyAcceptHeaderLocaleResolver();
if (locale.length() != 0 && locale != null) { // 錯誤順序:先判斷 length 再判斷 null
Locale l = new Locale(locale);
mhlr.setLocale(httpServletRequest, httpServletResponse, l);
return "login";
}
}
}
locale.length() != 0 && locale != null 條件順序顛倒,當 locale 為 null 時,先執行 length() 會拋出 NullPointerException。正確順序應為 locale != null && locale.length() != 0。locale 參數,getParameter 返回 null,後續邏輯會失效。String locale = request.getParameter("locale");
if (locale != null && !locale.isEmpty()) {
// 直接使用參數值,無需正則校驗
Locale l = new Locale(locale);
MyAcceptHeaderLocaleResolver mhlr = new MyAcceptHeaderLocaleResolver();
mhlr.setLocale(request, response, l);
return "login";
}
getParameter(String name) 直接獲取指定參數,簡潔且安全。str != null && !str.isEmpty() 的順序。getQueryString() 進行複雜正則匹配,除非有特殊解析需求。掌握這些細節,能讓你的 Servlet 參數處理更加健壯、易維護。