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

Java 空指針異常排查:數組部分初始化導致後續元素為 null

     編輯:程式設計綜合問答

問題代碼


public static void test() {
    String[] str = new String[1024]; // 1. 分配引用數組,所有元素默認 null
    for (int i = 0; i < 200; i++) {
        str[i] = "23232";            // 2. 僅初始化前 200 個
    }
    int max = 0;
    for (int i = 1; i < str.length - 1; i++) { // 3. 遍歷全部 1024 個
        if (str[i].length() > 0)     // 4. i>=200 時 str[i] 為 null → NPE
            max += 1;
    }
    System.out.print(max);
}

異常堆疊分析


Exception in thread "main" java.lang.NullPointerException
    at Test.test(Test.java:XX) // str[i].length() 行
  • 數組 `str` 長度 1024。
  • 索引 `0~199` 指向字符串對象 `"23232"`。
  • 索引 `200~1023` 仍為 **默認值 `null`**。
  • 第二個循環遍歷到 `i=200` 時,`str[200]` 為 `null`,調用 `.length()` 拋出 `NullPointerException`。

修復方案(三選一)

方案一:遍歷前檢查非 null(最直接)


for (int i = 1; i < str.length - 1; i++) {
    if (str[i] != null && str[i].length() > 0) // 短路求值,先判 null
        max += 1;
}

方案二:初始化所有元素(語義明確)


String[] str = new String[1024];
Arrays.fill(str, ""); // 全部初始化為空字符串 ""
// 或循環賦值
for (int i = 0; i < str.length; i++) str[i] = "";

方案三:使用 List 替代數組(現代 Java 首選)


List list = new ArrayList<>(1024);
for (int i = 0; i < 200; i++) list.add("23232");
// 後續遍歷無 NPE 風險,size() 為實際元素數
for (String s : list) {
    if (s.length() > 0) max++;
}

核心知識點總結

概念說明
引用類型數組默認值`null` (非空字符串 `""`)
基本類型數組默認值`0` / `false` / `0.0` 等
數組長度 vs 元素個數`length` 是容量,非有效數據量
短路求值 `&&`左邊為 `false` 右邊不執行,防 NPE 利器

調試技巧

  • **斷點觀察數組內容**:IDEA/Eclipse Variables 面板展開數組,灰色 `null` 明顯可見。
  • **異常斷點**:設置 `NullPointerException` 異常斷點,自動定位拋出行。
  • **日志輸出數組狀態**:循環前 `System.out.println(Arrays.toString(str).substring(0, 200));` 快速檢查。

最佳實踐建議

  1. **優先用集合框架** (`List`/`Set`/`Map`) 替代裸數組,語義豐富、API 安全。
  2. **數組必須遍歷時**,用增強 for 循環 `for (String s : str)` 避免索引越界,內部仍需 `if (s != null)` 判斷。
  3. **初始化語義明確**:`new String[1024]` 只有引用槽位,無對象。需填充數據時用 `Arrays.fill`、流式 API `Stream.generate(() -> "").limit(1024).toArray(String[]::new)`。
  4. **編碼規約**:阿里巴巴 Java 開發手冊強制要求「數組初始化後立即填充」或「遍歷前非空判斷」。

總結

**「數組創建 ≠ 元素初始化」** 是 Java NPE 高發區。本例中僅初始化 200/1024 元素,遍歷全量導致訪問 `null`。掌握「引用默認 `null`、遍歷前判空、優先用集合」三原則,可消除 90% 此類低級錯誤。

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