classes[][] 存班級,students[][] 存學生(students[i][2] 存該生所屬班級 ID)。students 中對應班級的所有學生。students[j][2].equals(delClass) 拋 NullPointerException;改 == 不報錯但刪不掉。students[j][2] 為 null:陣列預設值為 null,若該位置未賦值(如學生資料不完整),直接呼叫 .equals() 即 NPE。== 比較參考位址而非內容:字串用 == 只有字串常量池同一字面量才為 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]。Map<String, List<Integer>> classToStudentIndices,刪除時只遍歷受影響索引。「陣列元素可能為 null,呼叫方法前必須非空檢查;字串比較內容用
.equals(),比較參考用==。」
總結: NPE 來自未檢查 null 就呼叫 .equals();== 失效因字串非同一物件。改用集合框架+封裝類別,邏輯更清晰、效能更高、Bug 更少。