異常處理是 Java 開發的基本功,尤其在 JSP/Servlet 這類多請求參數、多外部資源交互的場景下,掌握高頻異常成因與防禦模式能顯著提升系統穩定性。
典型場景:
// 危險寫法
request.getParameter("username").equals("admin");
out.println(session.getAttribute("user"));
防禦模式:
成因:`Integer.parseInt("abc")`、`Double.parseDouble("1.2.3")`
處理策略:
try {
int id = Integer.parseInt(request.getParameter("id"));
} catch (NumberFormatException e) {
// 記錄日誌、回傳友善錯誤頁、預設值處理
}
建議封裝通用轉換工具類 `NumberUtils.toInt(str, defaultVal)`。
高風險 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()`。
典型原因:資料庫連線、檔案流、Socket 未關閉,導致檔案描述符/連線池耗盡
鐵律:
// Java 7+ try-with-resources (自動關閉)
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
// 業務邏輯
} // 自動按逆序關閉 rs, ps, conn
`System.out.println(null)` 輸出字串 `"null"` 而非拋 NPE,易掩蓋邏輯錯誤。調試時建議用 `Objects.toString(obj, "NULL")` 明確區分。