Data[] da = new Data[10]; // 僅分配引用陣列
da[0].setValue(1); // 拋出 NullPointerException
new Data[10] 在堆上分配一個長度為 10 的引用陣列,每個槽位預設值為 null。並不會自動構建 10 個 Data 物件。
Data[] da = {
new Data(1),
new Data(2),
new Data(3)
};
Data[] da = new Data[10];
for (int i = 0; i < da.length; i++) {
da[i] = new Data(); // 關鍵:為每個槽位分配物件
da[i].setId(i);
}
Data[] da = IntStream.range(0, 10)
.mapToObj(i -> new Data(i))
.toArray(Data[]::new);
| 寫法 | 結果 | 說明 |
|---|---|---|
Data[] da = new Data[10]; | 10 個 null | 僅分配引用容器 |
Data[] da = {new Data(), new Data()}; | 2 個物件 | 編譯器推導長度 |
Data[] da = new Data[]{new Data(), new Data()}; | 2 個物件 | 顯式類型 |
List<Data> list = new ArrayList<>(); list.add(new Data()); | 動態擴容 | 推薦優先用 List |
List<Data>:避免固定長度限制,內建擴容、迭代、流式操作。Arrays.setAll(da, i -> new Data(i)) (Java 8)。if (da[i] != null) 或使用 Objects.requireNonNull(da[i])。Data[] createArray(int n) { return IntStream.range(0,n).mapToObj(Data::new).toArray(Data[]::new); }null 即未初始化。-Xcheck:jni 捕獲本地代碼空指針。NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE。記住:陣列存的是「遙控器」,new 陣列只是造了一堆空遙控器槽,每台車(物件)還得單獨 new 出來再綁定。