異常定位核心步驟
- **閱讀堆棧跟蹤**:`NullPointerException at line 68` → 打開編輯器跳轉到第 68 行。
- **識別訪問路徑**:如 `mp5.getName()`、`list.add(mp5)`、`map.get(key).method()`。
- **判斷哪個引用為 null**:第 68 行可能有多個點操作,需拆分。
例:`mp5.getName()` → `mp5` 為 null。`a.b.c()` → `a` 或 `a.b` 為 null。
拆分調試法 (無 IDE 斷點時)
// 原: obj = mp5.getSomething(); // 第68行
// 拆分:
System.out.println("mp5 = " + mp5); // 觀察輸出
if (mp5 != null) {
Object temp = mp5.getSomething();
System.out.println("temp = " + temp);
obj = temp;
} else {
System.err.println("mp5 is null! 堆棧:"); new Exception().printStackTrace();
}
常見導致 mp5 為 null 的原因
- 數據庫查詢無結果:`ResultSet.next()` 返回 false,未賦值。
- 網絡通訊超時/異常:`ObjectInputStream.readObject()` 返回 null 或拋異常未捕獲。
- Map 取值鍵不存在:`map.get("key")` 返回 null。
- 對象池/緩存未命中:`pool.get()` 返回 null。< /li>
防御性編程模板
// 從數據庫/網絡獲取對象
MP5 mp5 = dao.findById(id);
if (mp5 == null) {
log.warn("MP5 not found for id={}", id);
return Response.error("商品不存在");
}
// 後續安全使用 mp5