Java数组声明与初始化必须严格区分声明、实例化、赋值三阶段,花括号{}仅限声明语句使用,混用new与{}或未实例化即访问将导致编译错误或NullPointerException。

Java 数组声明与初始化看似简单,但初学者极易在语法细节上踩坑,导致编译失败。核心问题在于混淆“声明”“实例化”和“赋值”三个阶段,且对花括号初始化({})的使用边界缺乏认知。下面结合高频错误场景,直击要害。
花括号初始化只能用于声明语句
这是最常触发 illegal start of expression 或 array initializer not allowed here 的原因。
-
错误写法:先声明变量,再用花括号赋值
int[] arr;<br>arr = {1, 2, 3}; // ❌ 编译报错 -
错误写法:混用
new和花括号(维度已指定却还给初值)int[] arr = new int[3]{1, 2, 3}; // ❌ illegal initializer for int[] -
正确写法(两种等效形式,本质都是隐式或显式创建新数组):
int[] arr = {1, 2, 3}; // ✅ 隐式 new,仅限声明时int[] arr = new int[]{1, 2, 3}; // ✅ 显式 new + 初始化器,可在任意表达式位置
注意:new int[]{...} 是合法表达式,可用于方法调用、return、匿名内部类等;而 {...} 不是表达式,只属于声明语法糖。
变量未声明或未实例化就直接使用
典型报错:g cannot be resolved to a variable 或 variable might not have been initialized。
立即学习“Java免费学习笔记(深入)”;
-
错误写法(在循环内边声明边用):
for (int j = 0; j < n; j++) {<br> int g[j][k] = sc.nextInt(); // ❌ 三重违法:未声明g、j非编译时常量、未new -
正确流程必须分三步,缺一不可:
① 声明:告诉编译器你要一个二维数组变量
② 实例化:用new int[n][n]分配内存(维度可为运行时变量)
③ 赋值:用下标如g[i][j] = value存入具体值 - 示例修正:
int[][] g = new int[n][n]; // ✅ 声明+实例化一步到位<br>for (int i = 0; i < n; i++) {<br> for (int j = 0; j < n; j++) {<br> g[i][j] = sc.nextInt(); // ✅ 此时g已存在且有内存
引用类型数组元素未判空就调用方法
数组本身初始化成功,不代表每个元素都可用。基本类型数组(如 int[])元素自动为 0/false;但引用类型(如 String[])元素默认全是 null。
-
危险写法:
String[] strs = new String[3];<br>strs[0].trim(); // ❌ NullPointerException
-
安全做法:
– 元素使用前加判空:if (strs[i] != null) strs[i].trim();
– 或统一初始化:String[] strs = new String[]{"a", "b", "c"};
– 或循环赋值:for (int i = 0; i < strs.length; i++) strs[i] = "";
类型不匹配与维度误用
数组是强类型结构,初始化器中所有值必须能被目标类型接受;多维数组维度不能颠倒或缺失。
-
类型错误示例:
int[] nums = {1, 2, "3"}; // ❌ String 无法转 int -
二维数组常见误写:
int[][] mat = new int[3][]; // ✅ 合法:第一维固定,第二维可变<br>mat[0] = new int[5]; // ✅ 必须单独为每行分配<br>mat[1] = new int[2]; // ✅
但若漏掉某行分配,后续访问mat[1][0]仍会 NPE。 -
动态大小二维数组不能这样写:
int[][] bad = new int[n][m]; // ✅ 合法(n/m 是变量)<br>int[][] wrong = new int[j][k]; // ❌ 若 j/k 在声明时尚未定义或不在作用域


















