首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

解決 Java 文件上傳中 NumberFormatException:categoryId 解析失敗排查指南

     編輯:程式設計疑難解答

問題現象

在使用 Apache Commons FileUpload 處理文件上傳的 Servlet 中,嘗試將表單字段 categoryId 解析為整數時拋出 java.lang.NumberFormatException:

categoryId = Integer.parseInt(item.getString());
// 報錯:For input string: "..."

後續還出現 MySQL 唯一鍵衝突錯誤:Duplicate entry '...' for key 'ChineseName'。

根因分析

  1. 字符串非純數字:item.getString() 返回的字符串可能包含空格、換行符、隱藏字符,或根本不是數字(如空字符串、中文)。
  2. 編碼不一致:獲取字符串時未指定編碼(如 UTF-8),導致中文參數解析出亂碼,進而影響數字解析。
  3. 業務邏輯缺陷:未對解析結果進行非空、合法性校驗直接入庫,導致重複鍵衝突。

解決方案

1. 打印原始值診斷

在解析前輸出原始字符串,確認內容:

String raw = item.getString("UTF-8"); // 指定編碼
System.out.println("categoryId 原始值: [" + raw + "]"); // 方括號便於觀察空白字符
categoryId = Integer.parseInt(raw.trim());

2. 健壯的解析工具方法

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);

3. 完善業務校驗

在入庫前檢查必填字段與唯一性:

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"))。
  • 解析數字前**打印原始值**並 **trim()** 去除空白。
  • 封裝安全解析工具方法,避免重複 try-catch。
  • 業務層面增加唯一性檢查,提供友好錯誤提示而非拋出 SQL 異常。

遵循以上步驟,即可徹底解決文件上傳場景下的數字解析與數據完整性問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved