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

Java 物件陣列 NullPointerException 根因與正確初始化姿勢

     編輯:程式設計綜合問答

錯誤現場

Data[] da = new Data[10]; // 僅分配引用陣列
da[0].setValue(1); // 拋出 NullPointerException

根本原因

new Data[10] 在堆上分配一個長度為 10 的引用陣列,每個槽位預設值為 null。並不會自動構建 10 個 Data 物件。

正確初始化三種模式

1. 靜態已知資料:陣列初始化器

Data[] da = {
    new Data(1),
    new Data(2),
    new Data(3)
};

2. 動態構建:循環 new 每個元素


Data[] da = new Data[10];
for (int i = 0; i < da.length; i++) {
    da[i] = new Data(); // 關鍵:為每個槽位分配物件
    da[i].setId(i);
}

3. 流式 API(Java 8+)


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

最佳實踐建議

  1. 優先使用 List<Data>:避免固定長度限制,內建擴容、迭代、流式操作。
  2. 必須用陣列時:緊接著分配循環,或用 Arrays.setAll(da, i -> new Data(i)) (Java 8)。
  3. 防禦性編程:存取前檢查 if (da[i] != null) 或使用 Objects.requireNonNull(da[i])。
  4. 工廠方法封裝:Data[] createArray(int n) { return IntStream.range(0,n).mapToObj(Data::new).toArray(Data[]::new); }

除錯技巧

  • IDE 斷點查看陣列內容:顯示 null 即未初始化。
  • 啟用 -Xcheck:jni 捕獲本地代碼空指針。
  • 靜態分析工具:SpotBugs 會報警 NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE。

記住:陣列存的是「遙控器」,new 陣列只是造了一堆空遙控器槽,每台車(物件)還得單獨 new 出來再綁定。

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