System.out.println(null) 不拋異常,但後續操作會炸String s = null;
System.out.println(s); // 輸出 "null",不拋 NPE
int len = s.length(); // 這裡拋 NullPointerException
對策:Objects.toString(obj, "")、String.valueOf(obj)、或提前判空。日誌框架 (SLF4J) 佔位符 "{}", obj 自動處理 null。
// 危險寫法
if (request.getParameter("username").equals("admin")) { ... }
// 安全寫法
String username = request.getParameter("username");
if ("admin".equals(username)) { ... } // 常量在前,天然防 NPE
// 或 Java 8+
Optional.ofNullable(request.getParameter("username"))
.filter("admin"::equals)
.ifPresent(...);
高發場景:session.getAttribute()、request.getAttribute()、map.get(key) 直接鏈式調用。
NumberFormatException// 危險
int age = Integer.parseInt(request.getParameter("age"));
// 安全
int age = 0;
try {
age = Integer.parseInt(request.getParameter("age"));
} catch (NumberFormatException e) {
log.warn("非法年齡參數", e);
// 返回錯誤提示 / 使用默認值
}
工具類封裝:NumberUtils.toInt(str, defaultVal) (Apache Commons Lang)。
String.substring/indexOf/charAt 越界拋 StringIndexOutOfBoundsException// 危險
String suffix = filename.substring(filename.lastIndexOf('.') + 1);
// 安全
int dot = filename.lastIndexOf('.');
String suffix = (dot > 0 && dot < filename.length() - 1)
? filename.substring(dot + 1) : "";
通用策略:判空 → 判長度/索引合法 → 再切片。或用 FilenameUtils.getExtension() (Commons IO)。
NoClassDefFoundError ≠ ClassNotFoundException| 異常 | 原因 | 排查方向 |
|---|---|---|
ClassNotFoundException | 運行時 Class.forName()/類載入器找不到類 | Classpath 缺失 JAR、拼寫錯誤 |
NoClassDefFoundError | 類文件存在,但靜態初始化失敗 或 版本不匹配 (主版本號) | 靜態區塊拋異常、JAR 衝突、JDK 版本不兼容 |
關鍵:NoClassDefFoundError 往往伴隨 ExceptionInInitializerError,查看根因 (Cause)。
// 危險:異常路徑未關閉
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
// 正常關閉,但中間拋異常則洩漏
// 鐵律:try-with-resources (JDK 7+)
try (Connection conn = ds.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
// 業務邏輯
} // 自動逆序關閉,異常時也保證關閉
資源類別:數據庫連接/Statement/ResultSet、文件/網絡流、鎖 (Lock)、HTTP 客戶端、線程池。
AutoCloseable/Closeable 的資源,強制 try-with-resources這六大坑覆蓋了 80%+ 線上故障根因。把「防禦性編程」刻進肌肉記憶,比背誦設計模式更實在。