Java数组常见错误源于混淆声明、实例化、赋值三步顺序:声明仅定义变量,未分配内存;局部变量必须显式new实例化后才能访问;二维数组需先new intn,再用双重循环赋值;遍历时索引范围为0到length-1。

Java数组用得频繁,但初学者常在声明、初始化和遍历三个环节踩坑——不是编译不通过,就是运行时报错,而且错误信息看起来“莫名其妙”。核心问题不在语法本身,而在于没理清“声明→实例化→赋值”这三步的先后关系,以及数组作为引用类型的内存行为。
声明时就以为能用了
只写 int[] arr; 或 int[][] matrix;,没做任何后续操作,就直接用 arr[0] = 5; 或 matrix[1][1] = 10; —— 这会触发编译错误:“可能未初始化的局部变量”。因为声明只是告诉编译器“我要一个数组变量”,它此刻还没指向任何内存空间,就像写了“我订了一间房”,但酒店根本没给你分配房间号。
- 正确做法:声明后必须显式实例化(new int[5] 或 new int[3][3]),才能安全访问元素
- 例外情况:类成员变量会被JVM默认初始化为 null(引用类型)或 0(基本类型数组),但局部变量不会
- 小技巧:IDE常标黄提示“Variable 'xxx' might not have been initialized”,别忽略它
实例化维度写错或混用索引
常见于二维数组输入场景,比如想读入 n×n 的矩阵,却在循环里写:int g[j][j] = sc.nextInt();。这行代码错得彻底:j 是变量,不能用于声明语法;g 根本没定义过;维度应是 [j][k] 而非 [j][j];更关键的是,缺了 new 分配内存这一步。
- 二维数组必须先整体实例化:int[][] g = new int[n][n];(n 是已知大小)
- 遍历时外层用 i 控制行,内层用 j 控制列,赋值写成 g[i][j] = sc.nextInt();
- 别把声明、创建、赋值揉在一行——Java 不支持类似 C 的“int arr[5] = {1,2,3}”式声明+初始化混合写法(局部变量)
遍历时越界或空指针
数组长度是 arr.length,不是 arr.length()(那是字符串方法);索引范围永远是 0 到 length-1。写 for (int i = 0; i 或 arr[arr.length],必然触发 ArrayIndexOutOfBoundsException。另外,如果中途写了 arr = null;,再访问 arr[0] 就会抛 NullPointerException。
立即学习“Java免费学习笔记(深入)”;
- 循环条件统一用 i ,别手滑写成
- 多维数组用 matrix.length 得行数,matrix[0].length 得列数(前提是 matrix 和 matrix[0] 都非 null)
- 使用前加 null 检查:if (arr != null && i ,尤其处理方法返回的数组时
混淆默认初始化与显式初始化
new int[5] 后,数组元素自动是 0;new String[3] 后,每个元素是 null。有人误以为“只要 new 过,所有元素就有值”,结果对 String 数组直接调用 arr[i].trim(),却忘了它可能是 null,导致空指针异常。
- 基本类型数组(int/boolean/double等)new 之后有确定默认值,可直接参与运算
- 引用类型数组(String/Object 等)new 之后元素全为 null,使用前必须判空或显式 new 对象
- 静态初始化如 int[] a = {1, 2, 3}; 是声明+实例化+赋值一步到位,但仅适用于编译期已知全部值的场景


















