String[][] splStrAg = new String[splStr.length][]; // 僅初始化第一維
double[][] d = new double[splStr.length][]; // 僅初始化第一維
// ...
for (int i = 0; i < splStr.length; i++) {
splStrAg[i] = splStr[i].split(","); // 第二維在此處賦值
// ...
for (int j = 0; j < splStrAg[i].length; j++) {
d[i][j] = Double.parseDouble(splStrAg[i][j]); // NPE 發生處
}
}
聲明 `new String[n][]` 僅分配了第一維引用數組,第二維各行數組仍為 null。雖然後續循環為 `splStrAg[i]` 賦值了字符串數組,但 `d[i]` 從未初始化,直接訪問 `d[i][j]` 導致 NullPointerException。
// 方式一:循環中同步初始化第二維
double[][] d = new double[splStr.length][];
for (int i = 0; i < splStr.length; i++) {
splStrAg[i] = splStr[i].split(",");
d[i] = new double[splStrAg[i].length]; // 關鍵:為每行分配具體長度
for (int j = 0; j < splStrAg[i].length; j++) {
d[i][j] = Double.parseDouble(splStrAg[i][j]);
}
}
// 方式二:若行長固定,可一次性初始化(此處行長不固定,不適用)
// double[][] d = new double[splStr.length][固定列數];
牢記「Java 多維數組本質是數組的數組」,逐層初始化是避免 NPE 的關鍵。