在使用 Apache Commons FileUpload 處理文件上傳的 Servlet 中,嘗試將表單字段 categoryId 解析為整數時拋出 java.lang.NumberFormatException:
categoryId = Integer.parseInt(item.getString());
// 報錯:For input string: "..."
後續還出現 MySQL 唯一鍵衝突錯誤:Duplicate entry '...' for key 'ChineseName'。
item.getString() 返回的字符串可能包含空格、換行符、隱藏字符,或根本不是數字(如空字符串、中文)。在解析前輸出原始字符串,確認內容:
String raw = item.getString("UTF-8"); // 指定編碼
System.out.println("categoryId 原始值: [" + raw + "]"); // 方括號便於觀察空白字符
categoryId = Integer.parseInt(raw.trim());
public static Integer parseIntegerSafely(String str, Integer defaultValue) {
if (str == null) return defaultValue;
str = str.trim();
if (str.isEmpty()) return defaultValue;
try {
return Integer.parseInt(str);
} catch (NumberFormatException e) {
return defaultValue; // 或拋出業務異常
}
}
// 使用
categoryId = parseIntegerSafely(item.getString("UTF-8"), 0);
在入庫前檢查必填字段與唯一性:
if (chineseName != null && englishName != null
&& description != null && categoryId != 0) {
// 建議先查詢是否存在同名記錄
if (!foodDao.existsByChineseName(chineseName)) {
Food food = new Food(0, chineseName, englishName, categoryId, description);
foodDao.addFoods(food);
response.sendRedirect("food/admin/foodsListServlet");
} else {
// 處理重複名稱邏輯
}
} else {
request.getRequestDispatcher("error.jsp").forward(request, response);
}
item.getString("UTF-8"))。遵循以上步驟,即可徹底解決文件上傳場景下的數字解析與數據完整性問題。