在Java编程中,数组是存储同类型数据的固定长度容器,获取数组长度是我们操作数组时经常需要用到的能力,而数组越界异常也是新手最容易遇到的运行时错误之一,掌握这两部分知识能有效减少开发中的低级错误。

一、如何获取Java数组的长度
Java中数组是对象,每个数组实例都自带一个length属性,这个属性用来存储数组的长度,也就是数组能容纳的元素个数。需要注意的是,length是属性不是方法,所以调用的时候不需要加括号,和String类的length()方法要区分开。
不管是基本类型数组还是引用类型数组,获取长度的方式都是一致的,直接通过数组名.length即可获取。下面通过几个示例来演示不同数组的长度获取方式:
public class ArrayLengthDemo {
public static void main(String[] args) {
// 整型数组
int[] intArray = new int[5];
System.out.println("整型数组长度:" + intArray.length);
// 字符串数组
String[] strArray = {"Java", "Python", "C++"};
System.out.println("字符串数组长度:" + strArray.length);
// 二维数组,获取的是第一维的长度
int[][] twoDArray = new int[3][4];
System.out.println("二维数组第一维长度:" + twoDArray.length);
System.out.println("二维数组第二维第一个子数组长度:" + twoDArray[0].length);
}
}
上面的代码运行后,输出结果分别是5、3、3、4,符合我们创建数组时的设定。这里要特别注意,二维数组的length属性获取的是第一维的元素个数,也就是包含的子数组的数量,如果要获取子数组的长度,需要指定子数组的索引再调用length属性。
二、常见的数组越界异常场景
数组越界异常的全称是ArrayIndexOutOfBoundsException,属于运行时异常,编译阶段不会报错,只有程序运行到对应逻辑时才会抛出。最常见的触发场景有以下几种:
1. 索引小于0
Java数组的索引是从0开始的,最小的索引是0,如果使用了负数作为索引,就会触发越界异常。
public class ArrayIndexDemo1 {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
// 索引为-1,小于最小索引0,触发异常
int num = arr[-1];
}
}
2. 索引大于等于数组长度
数组的最大索引是length - 1,如果使用的索引大于等于length,就会超出数组的索引范围,触发异常。
public class ArrayIndexDemo2 {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
// 数组长度是3,最大索引是2,访问索引3触发异常
int num = arr[3];
}
}
3. 循环遍历时边界设置错误
在使用循环遍历数组时,如果边界条件设置错误,很容易触发越界。比如循环条件写成了i <= arr.length,就会多访问一个索引,导致异常。
public class ArrayIndexDemo3 {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
// 错误循环条件,i可以取到3,触发异常
for (int i = 0; i <= arr.length; i++) {
System.out.println(arr[i]);
}
}
}
4. 动态修改数组长度时的越界
Java数组的长度是固定的,创建后不能修改,如果尝试通过某种方式修改数组长度,再访问原有范围外的索引,也会触发异常。比如下面这种错误的尝试:
public class ArrayIndexDemo4 {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
// 错误认知:认为可以给数组重新赋值长度,实际这是创建了新的数组
// arr = new int[5]; 如果放开这行,下面的访问是合法的,但如果没重新赋值,arr长度还是3
int num = arr[4]; // 触发异常
}
}
三、数组越界异常的排查方法
当程序抛出ArrayIndexOutOfBoundsException时,可以按照以下步骤排查问题:
- 首先查看异常堆栈信息,找到抛出异常的具体代码行号,定位到对应的数组访问逻辑。
- 检查访问数组的索引值,确认索引是否小于0,或者是否大于等于数组的
length属性值。 - 如果是循环遍历导致的异常,检查循环的初始值、边界条件和步长,确认循环变量的取值范围是否在数组索引的有效范围内。
- 如果数组是作为参数传递或者动态生成的,可以在访问前打印数组的
length属性和要访问的索引值,确认两者的关系是否符合预期。
下面是一个排查的示例,假设程序抛出了越界异常,我们可以通过添加打印逻辑来定位问题:
public class ArrayExceptionCheck {
public static void main(String[] args) {
int[] arr = getArray();
int index = getIndex();
// 访问前打印数组长度和索引,确认是否越界
System.out.println("数组长度:" + arr.length + ",访问索引:" + index);
if (index >= 0 && index < arr.length) {
System.out.println("数组元素:" + arr[index]);
} else {
System.out.println("索引超出数组范围,无法访问");
}
}
private static int[] getArray() {
return new int[]{1, 2, 3};
}
private static int getIndex() {
return 3;
}
}
四、规避数组越界的最佳实践
为了减少数组越界异常的出现,开发时可以遵循以下实践:
- 访问数组元素前,先判断索引是否在有效范围内,即
index >= 0 && index < 数组名.length,再做访问操作。 - 遍历数组时,优先使用增强for循环(for-each),避免手动控制索引,减少边界错误的可能。增强for循环的语法是
for (元素类型 变量名 : 数组名) { ... },不需要关心索引,自然不会越界。 - 如果确实需要手动控制索引遍历,循环条件统一写成
i < arr.length,不要写成i <= arr.length - 1,减少出错概率。 - 当数组长度可能变化时,考虑使用
ArrayList等动态容器替代数组,动态容器会自动处理扩容和索引校验,减少越界风险。
下面是增强for循环遍历数组的示例,这种方式完全不需要关心索引,也不会出现越界问题:
public class ForEachDemo {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
// 增强for循环遍历,无需索引,不会越界
for (int num : arr) {
System.out.println(num);
}
}
}
总结来说,Java数组的长度通过length属性获取,这个属性是数组实例自带的,不需要加括号调用。数组越界异常的核心是访问了不在0到length-1范围内的索引,开发时做好索引校验,合理使用遍历方式,就能有效避免这类异常的发生。
Java数组length属性数组越界ArrayIndexOutOfBoundsException异常排查修改时间:2026-07-11 09:12:42