Sinfo[] su = new Sinfo[n]; // 只分配了引用數組,每個元素為 null
su[i].name = cin.next(); // su[i] 為 null → NPE
su (引用) → [ null, null, null, ... ] // 長度 n 的引用數組
↓ 需要 new Sinfo() 分配對象
Sinfo 對象 (name, age, grade)
Sinfo[] su = new Sinfo[n];
for (int i = 0; i < n; i++) {
su[i] = new Sinfo(); // 關鍵:為每個引用分配實例
su[i].name = cin.next();
su[i].age = cin.nextInt();
su[i].grade = cin.nextInt();
}
| 類型 | 聲明 | 默認值 | 是否需逐個 new |
|---|---|---|---|
| 基本類型 | int[] a = new int[10]; | 0 | 否,直接賦值 a[i] = 5 |
| 引用類型 | Sinfo[] a = new Sinfo[10]; | null | 是,a[i] = new Sinfo() 後才能訪問字段 |
Sinfo[] su = new Sinfo[n]; 以為創建了 n 個對象,**實則只創建了 n 個 null 引用槽**。Java 引用類型數組聲明後元素全為 null,**使用前必須逐個 new 實例化**。修正循環中加 su[i] = new Sinfo(); 即可解決空指針異常。