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

Java 與 JSP 開發六大高發錯誤:成因、現場還原與防禦編程指南

     編輯:Java 相關知識

1. String println(null) 的隱性陷阱

System.out.println(str) 或 out.println(str) 當 str == null 時輸出字面量 "null",不拋 NPE。
隱患:掩蓋了對象未初始化的事實,後續調用 str.length()、str.trim() 才真正拋異常,排查困難。
防禦:關鍵業務字段顯式判空,或用 Objects.toString(obj, "") (Java 9+)/String.valueOf(obj) 安全轉換。

2. NullPointerException —— 王者級高發異常

典型現場:

// JSP/Controller 常見
if (request.getParameter("username").equals("admin")) // 參數缺失 → null.equals → NPE
out.println(session.getAttribute("user")); // 屬性不存在 → null → println 輸出 "null" 但後續操作崩

鐵律:使用前必判空。模式:

String username = request.getParameter("username");
if (username != null && username.equals("admin")) { ... }
// 或 Java 8+ Optional
Optional.ofNullable(username).filter("admin"::equals).ifPresent(...);

3. NumberFormatException —— 用戶輸入的不可信

場景:Integer.parseInt(request.getParameter("age")),用戶輸入 "abc" 或 "12.5"。
處理:邊界統一攔截。Controller 入口用 try-catch 捕獲,返回友好錯誤碼/頁面;或用 Spring @InitBinder + 自定義 PropertyEditor/Converter 統一轉換異常處理。

4. StringIndexOutOfBoundsException —— 字符串操作越界

成因:substring(3,4)、charAt(5) 但字符串長度不足;或對 null 調用導致 NPE。
封裝工具類:


public class StrUtils {
    public static String safeSubstring(String s, int begin, int end) {
        if (s == null || begin < 0 || end > s.length() || begin >= end) return "";
        return s.substring(begin, end);
    }
    public static char safeCharAt(String s, int index, char defaultVal) {
        return (s != null && index >= 0 && index < s.length()) ? s.charAt(index) : defaultVal;
    }
}

業務代碼調用工具類,集中處理邊界、空值、編碼轉換。

5. NoClassDefFoundError —— 部署配置錯誤

本質:類文件存在但運行時類加載器找不到。
排查清單:

  • 類文件是否部署到正確目錄 (WEB-INF/classes、lib/*.jar)
  • 包名與目錄結構是否一致
  • 服務器是否熱加載失敗 → 重啟應用/服務器
  • 多類加載器環境 (EAR/WAR 隔離) 導致類可見性問題

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

三大成因:

  1. 外部資源 (DB 連接、Socket、文件句柄) 未關閉 → 耗盡
  2. 資源 重複關閉 或關閉順序錯 → 底層庫拋錯
  3. 外部系統異常 (DB 掛了、網絡斷了) 未熔斷/重試

治本方案:

  • Try-with-resources (Java 7+):自動關閉實現 AutoCloseable 的資源
  • 連接池:複用連接、驗證有效性、配置超時回收
  • 統一資源管理切面:AOP 統一打開/關閉 Session/Connection
  • 熔斷器:Hystrix/Resilience4j 防雪崩

總結:建立防禦編程體檢清單

錯誤類型核心原因一行代碼防禦
NPE未判空調用方法Objects.requireNonNull(obj) / Optional
NumberFormatException非法字符串轉數字統一轉換器 + 異常攔截
StringIndexOutOfBounds越界訪問字符串工具類安全封裝
NoClassDefFoundError部署缺失/類加載隔離Maven/Gradle 依賴管理 + 部署腳本檢查
Error (資源耗盡)資源未關閉/洩漏Try-with-resources + 連接池 + 監控告警

好程序員不寫不出錯的代碼,而寫「出錯也能自愈、可觀測、可定位」的代碼。

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