java数组只有length属性而非length()方法,是public final int字段,访问null数组会抛nullpointerexception,多维数组需逐级判空确保安全。

Java数组没有length()方法,只有length属性
Java数组是对象但不是类实例,不继承自Object的常规方法体系,所以不存在length()这种调用形式。写成arr.length()会直接编译失败,报错:cannot resolve method 'length()'。
正确方式永远是用点号访问length这个**public final int字段**:
int[] arr = {1, 2, 3};
System.out.println(arr.length); // ✅ 输出 3
-
length是数组的固有属性,不可修改,也不可重载 - 多维数组只有一级
length:比如int[][] mat,mat.length是行数,mat[0].length才是首行列数(需确保mat[0] != null) - 对
null数组访问length会抛NullPointerException,不是ArrayIndexOutOfBoundsException
ArrayIndexOutOfBoundsException一定发生在运行时索引越界
编译器不会检查数组下标是否合法,所有越界判断都在JVM执行时触发。典型错误场景包括循环条件写错、空数组未判空、动态计算索引漏掉边界校验。
常见错误写法:
for (int i = 0; i
- 错误信息固定为:
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3(JDK 8+含具体长度提示) - 负数索引同样触发此异常,比如
arr[-1] - 集合类(如
ArrayList)的get()方法也抛同一异常类型,但原因不同——别误以为是数组问题
length属性和集合size()方法不能混用
新手常把数组length和List.size()、String.length()记混。它们语义一致(都表示“元素个数”),但语法和底层机制完全不同。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
int[]→arr.length(字段,无括号) -
ArrayList<integer></integer>→list.size()(方法调用,必须加括号) -
String→s.length()(也是方法,返回字符数,不是字节数) - 误写
list.length或str.length会编译报错:cannot find symbol
尤其注意从数组转集合后的误用:
int[] arr = {1, 2, 3};
List<integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());
// ❌ list.length 不存在;✅ list.size()
</integer>
二维数组length嵌套访问要防null指针
声明int[][] grid = new int[3][]后,grid.length == 3成立,但grid[0]、grid[1]、grid[2]默认都是null。此时访问grid[0].length会立即抛NullPointerException。
- 不能假设“二维数组已完全初始化”,必须逐层判空
- 安全写法示例:
if (grid != null && grid.length > 0 && grid[0] != null) {
int rows = grid.length;
int cols = grid[0].length; // ✅ 此时才安全
}
这种嵌套判空在处理稀疏矩阵、JSON解析结果或用户输入数据时特别容易漏掉。
数组长度本身很简单,但和null、多维、类型转换搅在一起时,最容易在深夜调试时卡住——尤其是异常堆栈里只显示NullPointerException,却没说清是哪个维度的引用为空。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










