不会。一维基本类型数组声明未初始化时变量为null,直接访问arr[0]抛NullPointerException;new初始化后元素有默认值;大括号初始化仅限声明时使用;越界抛ArrayIndexOutOfBoundsException,下标从0到length-1。

Java一维数组声明后不初始化就访问会抛 NullPointerException 吗?
不会。一维基本类型数组(如 int[]、boolean[])声明但未显式初始化时,数组对象本身为 null;但一旦用 new 分配了内存,元素会自动初始化为默认值(0、false 等)。真正危险的是:声明了数组变量却忘了 new,直接访问 arr[0] —— 此时触发的是 NullPointerException,因为 arr 是 null。
-
int[] arr;→arr是null,arr[0]抛NullPointerException -
int[] arr = new int[3];→arr非空,arr[0]是0,安全 -
String[] strs = new String[2];→ 元素是null,不是空字符串,strs[0].length()仍会抛NullPointerException
用 new 初始化 vs 直接大括号初始化,有什么实际区别?
二者语义不同:前者是运行时动态分配,后者是编译期确定长度的“匿名数组字面量”,本质是语法糖。最常踩的坑是——大括号初始化只能用于声明时,不能用于后续赋值(除非配合 new)。
-
int[] a = {1, 2, 3};✅ 合法(声明+初始化) -
int[] b; b = {1, 2, 3};❌ 编译错误:缺少类型信息 -
int[] c; c = new int[]{1, 2, 3};✅ 合法(等价于new int[3]后逐个赋值) - 性能上无差异,JVM 对两者都做相同优化;但大括号写法无法表达“只指定长度、不填值”的意图(比如留待循环填充)
访问越界时抛的异常是 ArrayIndexOutOfBoundsException,但具体下标怎么查?
异常堆栈里会明确打出越界值和数组长度,例如:java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 3。关键点在于:这个异常只在运行时检查,编译器不报错;且所有合法下标范围是 0 到 length - 1(闭区间),没有负索引,也没有类似 Python 的 -1 反向访问。
- 循环遍历时别手滑写成
i ,应该是 <code>i - 用增强 for 循环(
for (int x : arr))可彻底避开下标计算,但失去索引位置信息 - 如果需要带索引的安全访问,建议封装工具方法,而不是反复写
if (i >= 0 && i
数组长度固定,但业务需要“动态增删”怎么办?
Java 一维数组长度不可变,这是语言层面限制,不是用法问题。硬要“扩容”,只能新建更大数组并 System.arraycopy 复制——但频繁这么做性能差、易出错。真实项目中,该换就换。
立即学习“Java免费学习笔记(深入)”;
- 优先用
ArrayList替代int[](注意泛型擦除后装箱开销,大数据量考虑IntArrayList类库) - 若必须用原生数组(如 JNI、高性能数值计算),接受“固定长度”设计,提前预估容量,用
Arrays.copyOf封装一次扩容逻辑 - 别试图用
Arrays.asList(arr)当动态列表——它返回的是固定大小的List,add会抛UnsupportedOperationException
数组的“简单”背后是刚性约束,用错场景比用错语法更容易埋雷。











