Student[] stu = new Student[3]; 僅在堆中分配 **3 個引用槽位** (初始值均為 null),**不會自動創建 Student 對象**。必須顯式 new Student() 為每個槽位賦值,否則調用方法觸發 NullPointerException。
// 1. 聲明並分配引用空間
Student[] students = new Student[3];
// 2. 逐個實例化對象並賦值
for (int i = 0; i < students.length; i++) {
students[i] = new Student(); // 關鍵步驟!
students[i].setId(i + 1);
students[i].setName("學生" + (i + 1));
students[i].setScore(60 + i * 10);
}
// 3. 靜態初始化 (已知數據)
Student[] classA = {
new Student(1, "張三", 90),
new Student(2, "李四", 85),
new Student(3, "王五", 95)
};
public class StudentManager {
private static final File DATA_FILE = new File("data/students.txt");
public void saveStudents(Student[] students) throws IOException {
try (BufferedWriter bw = new BufferedWriter(new FileWriter(DATA_FILE))) {
for (Student s : students) {
bw.write(s.getId() + " " + s.getName() + " " + s.getScore());
bw.newLine();
}
}
}
public Student[] loadStudents(int count) throws IOException {
Student[] students = new Student[count];
try (BufferedReader br = new BufferedReader(new FileReader(DATA_FILE))) {
String line;
int i = 0;
while ((line = br.readLine()) != null && i < count) {
String[] parts = line.trim().split("\\s+");
students[i] = new Student(); // 必須 new 對象!
students[i].setId(Integer.parseInt(parts[0]));
students[i].setName(parts[1]);
students[i].setScore(Integer.parseInt(parts[2]));
i++;
}
}
return students;
}
public double averageScore(Student[] students) {
return Arrays.stream(students).mapToInt(Student::getScore).average().orElse(0);
}
}
數組長度固定,頻繁增刪請用 List:
list.add(new Student(...)) 自動擴容。list.removeIf(s -> s.getScore() < 60) 刪除不及格。Student[] arr = list.toArray(new Student[0]) 需轉數組時轉換。| 錯誤代碼 | 現象 | 修正 |
|---|---|---|
| Student[] s = new Student[3]; s[0].setName("A"); | NPE | 先 s[0] = new Student(); |
| Student[] s = new Student[3]; Arrays.fill(s, new Student()); | 所有元素指向同一對象 | 循環 new Student() |
| Student[] s = {}; s[0] = new Student(); | ArrayIndexOutOfBoundsException | 指定長度或用 ArrayList |
「new 數組 只分配引用,必須循環 new 對象」是 Java 引用類型數組的鐵律。掌握「聲明 → 分配 → 實例化 → 賦值」四步驟,配合 ArrayList 靈活應對動態場景,徹底告別 NPE 與共享引用陷阱。