首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 二維陣列刪除關聯資料:空指標陷阱與正確刪除邏輯

     編輯:程式設計疑難解答

問題場景

  • 兩個二維陣列:classes[][] 存班級,students[][] 存學生(students[i][2] 存該生所屬班級 ID)。
  • 刪除班級時,需同步刪除 students 中對應班級的所有學生。
  • 執行 students[j][2].equals(delClass) 拋 NullPointerException;改 == 不報錯但刪不掉。

根因分析

  1. students[j][2] 為 null:陣列預設值為 null,若該位置未賦值(如學生資料不完整),直接呼叫 .equals() 即 NPE。
  2. == 比較參考位址而非內容:字串用 == 只有字串常量池同一字面量才為 true,動態建立/讀入的字串必須用 .equals()。

修正代碼

// 假設 students 是 List<String[]> 或 ArrayList<String[]> 更靈活
// 這裡示範二維陣列原地刪除(標記法 + 緊湊)
String delClass = "ClassA"; // 要刪除的班級
int validCount = 0;
for (int j = 0; j < students.length; ++j) {
    String[] stu = students[j];
    // 關鍵:先檢查非 null 再比較內容
    if (stu != null && stu.length > 2 && stu[2] != null && stu[2].equals(delClass)) {
        // 標記刪除:將整行設為 null,或搬移後續元素前移
        students[j] = null; // 簡單標記
    } else if (stu != null) {
        // 保留:緊湊前移
        if (validCount != j) students[validCount] = stu;
        ++validCount;
    }
}
// 尾部清 null
for (int j = validCount; j < students.length; ++j) students[j] = null;

更佳資料結構建議

  • 用 Map<String, List<Student>>:Key=班級 ID,Value=學生列表。刪除班級直接 map.remove(classId),O(1)。
  • 定義 Student 類別:封裝 id, name, classId, ...,避免魔術索引 [2]。
  • 資料庫思維: 即使不上 DB,也應建立「索引」:Map<String, List<Integer>> classToStudentIndices,刪除時只遍歷受影響索引。

核心原則

「陣列元素可能為 null,呼叫方法前必須非空檢查;字串比較內容用 .equals(),比較參考用 ==。」

總結: NPE 來自未檢查 null 就呼叫 .equals();== 失效因字串非同一物件。改用集合框架+封裝類別,邏輯更清晰、效能更高、Bug 更少。

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