資深開發者深知:看似微不足道的疏忽,往往引發生產環境的致命故障。本文梳理Java/JSP開發中六類高頻異常/錯誤的成因、現場表現與工程化防範策略,助你在編碼階段築牢防線。
System.out.println(null)輸出字面量"null"而非拋NullPointerException,這種「寬容」極易造成錯覺:開發者誤以為對象非空,後續調用.trim()、.equals()等方法時才真正拋異常,導致問題定位延遲。
防範:統一使用Objects.toString(obj, "")或工具類安全輸出;關鍵業務字段強制非空驗證。
高發場景:request.getParameter("username").equals("xxx")、out.println(session.getAttribute("record"))。參數缺失或屬性未設置時直接調用方法。
防範:
String val = Optional.ofNullable(request.getParameter("k")).orElse("");if ("xxx".equals(param))(常量在前)@NonNull註解配合靜態分析工具(SpotBugs、SonarQube)編譯期攔截。將請求參數直接Integer.parseInt()或Double.parseDouble(),用戶輸入非數字字符即拋異常。
防範:控制器層統一校驗(Bean Validation @Pattern/@Digits),異常統一捕獲轉為友好提示,絕不讓堆棧跡暴露給前端。
調用substring()、charAt()時索引越界,或對null字符串操作。
防範:封裝安全字符串工具類StrUtil,內部集成isEmpty()、length()檢查,對外提供safeSubstring()、safeCharAt()等方法,業務代碼禁用原生API。
類文件未按容器規範放置(如WEB-INF/classes、WEB-INF/lib),或依賴jar版本衝突、缺失。
防範:採用Maven/Gradle管理依賴,mvn dependency:tree排查衝突;生產環境部署腳本自動化校驗關鍵類是否可載入。
數據庫連接、文件句柄、Socket連接未關閉或重複關閉,導致資源耗盡,最終觸發OutOfMemoryError或系統不可用。
防範鐵律:
testOnBorrow、validationQuery。finally塊確保單次關閉。這六類問題本質上均屬於「契約未履行」:參數契約、API契約、資源契約。建議團隊建立:統一異常處理框架 + 參數校驗攔截器 + 代碼規約靜態掃描 + 核心工具類庫四位一體的質量防線,將隱患消滅在開發環境。