首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java/JSP 開發必懂的 6 大常見異常與防禦性編程技巧

     編輯:Java 相關知識

前言

異常處理是 Java 開發的基本功,尤其在 JSP/Servlet 這類多請求參數、多外部資源交互的場景下,掌握高頻異常成因與防禦模式能顯著提升系統穩定性。

六大高頻異常深度解析

1. NullPointerException (NPE) — 王者級殺手

典型場景:

// 危險寫法
request.getParameter("username").equals("admin");
out.println(session.getAttribute("user"));

防禦模式:

  • 參數檢查:`if (param != null && param.equals("value"))`
  • 使用 `Objects.requireNonNull()` 或 `Optional` (Java 8+)
  • 集中驗證:Filter/攔截器層統一校驗必填參數

2. NumberFormatException — 使用者輸入陷阱

成因:`Integer.parseInt("abc")`、`Double.parseDouble("1.2.3")`

處理策略:

try {
    int id = Integer.parseInt(request.getParameter("id"));
} catch (NumberFormatException e) {
    // 記錄日誌、回傳友善錯誤頁、預設值處理
}

建議封裝通用轉換工具類 `NumberUtils.toInt(str, defaultVal)`。

3. StringIndexOutOfBoundsException — 字串操作越界

高風險 API:`substring(begin, end)`、`charAt(index)`

安全包裝:

public static String safeSubstring(String str, int begin, int end) {
    if (str == null) return "";
    int len = str.length();
    begin = Math.max(0, Math.min(begin, len));
    end = Math.max(begin, Math.min(end, len));
    return str.substring(begin, end);
}

或直接使用 Apache Commons Lang `StringUtils.substring()`。

4. NoClassDefFoundError — 類路徑配置錯誤

  • 編譯時存在、運行時缺失(依賴未打包、版本衝突)
  • Web 應用:確認 `WEB-INF/lib` 含必要 JAR,避免重複載入
  • 使用 `mvn dependency:tree` 排查傳遞依賴衝突

5. java.lang.Error — 資源洩漏導致的系統級崩潰

典型原因:資料庫連線、檔案流、Socket 未關閉,導致檔案描述符/連線池耗盡

鐵律:

// Java 7+ try-with-resources (自動關閉)
try (Connection conn = dataSource.getConnection();
     PreparedStatement ps = conn.prepareStatement(sql);
     ResultSet rs = ps.executeQuery()) {
    // 業務邏輯
} // 自動按逆序關閉 rs, ps, conn
  • 嚴禁在迴圈中重複獲取/關閉外部資源
  • 連線池配置 `maxWait`、`removeAbandoned` 防禦洩漏

6. println(null) 的隱性陷阱

`System.out.println(null)` 輸出字串 `"null"` 而非拋 NPE,易掩蓋邏輯錯誤。調試時建議用 `Objects.toString(obj, "NULL")` 明確區分。

總結:防禦性編程清單

  1. 所有外部輸入(參數、Header、Cookie、資料庫欄位)視為「不可信」
  2. 集中驗證、集中異常處理、統一錯誤回應
  3. 資源操作 100% 使用 try-with-resources 或 finally 關閉
  4. 善用工具庫 避免重複造輪子
  5. 日誌記錄「足夠資訊」:請求 ID、參數快照、堆疊追蹤
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved