int、double、boolean 等基本型別有預設值(0、false),編譯器強制初始化,故不會出現 NullPointerException。NPE 專屬於物件參考。
// JSP/Servlet 常見錯誤
out.println(request.getParameter("username")); // 若無此參數 → null → NPE
// 修正:防禦性檢查
String name = request.getParameter("username");
if (name != null) out.println(name);
else out.println("訪客");
String user = request.getParameter("username");
if (user.equals("root")) { ... } // user 為 null → NPE
// 修正:常量在前,或用 Objects.equals
if ("root".equals(user)) { ... } // 安全
if (Objects.equals(user, "root")) { ... } // JDK 7+ 推薦
String uname = session.getAttribute("user").toString(); // session 或 attribute 可能 null
// 修正:逐層驗證或 Optional 鏈
User u = (User) session.getAttribute("user");
String uname = (u != null) ? u.getName() : "匿名";
// JDK 8+ Optional 風格
String uname = Optional.ofNullable(session.getAttribute("user"))
.map(User.class::cast)
.map(User::getName)
.orElse("匿名");
| 策略 | 代碼模式 | 適用場景 |
|---|---|---|
| 1. 預設值兜底 | String s = val != null ? val : \"\"; | 後續邏輯可容忍空字串 |
| 2. 早期返回/繼續 | if (obj == null) return; | 無法處理時直接跳出 |
| 3. 明確拋出業務異常 | if (obj == null) throw new BizException(\"資料不存在\"); | 需讓上層感知並處理 |
@NonNull、IntelliJ 靜態分析、SpotBugs 靜態掃描Objects.requireNonNull(arg, \"參數不可為空\")Optional<T> 強迫呼叫端處理return list != null ? list : Collections.emptyList();JVM 參數 -XX:+ShowCodeDetailsInExceptionMessages(JDK 14+)可精確指出是哪個呼叫鏈環節為 null:
Exception in thread "main" java.lang.NullPointerException:
Cannot invoke "User.getName()" because "u" is null
at Main.main(Main.java:10)
養成「防禦性程式設計」習慣,NPE 將不再是專案頭號殺手。