【Java】数组的声明、初始化、arr.length、数组下标越界异常、二维数组、空指针异常

Java数组

2021/3/20 周六
复习内容: 数组的声明和初始化、数组的长度、数组访问、java.lang.ArrayIndexOutOfBoundsException数组下标越界异常、二维数组、java.lang.NullPointerException空指针异常

如有错误,欢迎在评论区指出,非常感谢!


数组是一种类型(与基础数据类型不一样),它能一次性定义多个同类型的变量,存放多个同类型数据。

一、声明数组

// 数据类型[] 数组名;
int[] arr;

// 数据类型 数组名[];
int arr[];

数据类型就是数组里存储元素的类型,[]代表数组,千万不要写漏。

以上两种方式都可以用来声明数组,但是一般建议使用第一种。

此时只是声明了数组,数组变量还没有被初始化。注意,在声明时不要规定数组的长度。

二、数组初始化

1. 动态初始化-只确定长度
// 数据类型 []数组名 = new 数据类型[数组长度];
int[] arr = new int[20];

或者如果数组brr已经被定义了,直接将等号后面new的数组变量赋值给brr也可以

int[] brr;
brr = new int[20]; // 这样也可以

此方式创建数组对象时,只需要指定数组的长度,数组中所有的元素的值默认为"零",具体各数据类型的"零"值为:

数据类型“零”
byte short int long0
float double0.0
booleanfalse
char’ '(空格)
引用数据类型null

注意此方式创建数组对象必须使用 new 关键字,且 = 前后数据类型一致

2. 动态初始化-确定长度和内容
// 数据类型 []数组名 = new 数据类型[]{v1,v2,v3,v4,...};
int[] arr = new int[]{v1,v2,v3,v4,...};

此方式创建数组时,数组中的元素值也依次为{ }里所给定的元素。

注意,[ ]内必须为空,不能在[ ]内指定数组长度,而是由{ }里元素的个数来决定数组的长度

此方式也可以定义和赋值分开:

int[] brr;
brr = new int[]{v1,v2,v3,v4,...}; // 这样也是可以的
2. 静态初始化
// 数据类型 []数组名 = {v1,v2,v3...};
int[] arr = {v1,v2,v3...};

数组的静态初始化也是确定长度和内容的。

注意,此方式不能先定义后赋值。即如果先声明数组,再用此种方式赋值是不可以的:

int[] brr;
brr = {v1,v2,v3...}; // 编译错误!!!

三、数组的属性

数组有一个长度属性,获得数组长度的方式为:数组名.length

int len = arr.length; // 获得数组arr的长度

在Java中允许数组的长度为0,即包含0个元素,这样的数组对象仍是一个Java对象,而且不同于null。虽然没有意义,但在语法上是合法的:

int[] arr = new int[0];
System.out.println(a.length);    // 输出结果为0

四、访问数组元素

访问数组元素的方式为:数组名[下标]

arr[0]; // 访问数组a的第1个元素

下标的取值范围 [0,数组长度),下标为0表示数组的第1个元素,下标的最大值为 数组长度-1

不能超过下标范围进行元素访问,否则将引发数组中最常见的:
java.lang.ArrayIndexOutOfBoundsException 数组下标越界异常

比如

int []arr ={1,2,3,4};

这个数组的长度为4,如果调用arr[4],运行时就会报数组越界异常:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
	at review.ErrorTest.main(ErrorTest.java:21)

异常提示了发生错误的时候,下标的值为4

因为下标为0表示数组的第1个元素,即这个数组的元素只有arr[0]=1, arr[1]=2, arr[2]=3, arr[3]=4,没有arr[4]

五、二维数组

如果数组中的元素也是数组,这样就可以组成多维数组,比如二维数组、甚至更多层次的三维数组等等(当然一般超过三维也没什么实际用处了,所以主要掌握二维数组就好了)。

1.数组声明

与一维数组声明类似,多一个[ ]

// 数据类型 [][]数组名;
int[][] arr ;
2.数组初始化

(1) 初始化一维数组(指定一维数组长度)

数据类型 [][]数组名  = new 数据类型[二维数组长度][一维数组长度];
int[][] arr = new int[3][4];

arr这个二维数组里有3个元素,都是长度为4、数据类型为int的一维数组,此时可以取某个数组里的元素的值,不过因为没给出具体值,所以默认为0。

可以再给一维数组里的元素赋值,如:

arr[0][0] = 11; // 第一个数组里的第一个值
arr[1][0] = 21; // 第二个数组里的第一个值
arr[2][0] = 31; // 第三个数组里的第一个值

另外要知道,二维数组真正存储的其实是一维数组的地址信息

(2) 不初始化一维数组(不指定一维数组长度)

数据类型 [][]数组名  = new 数据类型[二维数组长度][];
int [][] arr = new int[3][];

此时只说明了arr这个二维数组里有3个元素,都是数组,但这些一维数组并没有初始化过,即arr这个二维数组中的arr[0]、arr[1]、arr[2]这3个数组都是null。

所以此时不可以取一维数组里具体元素的值,否则运行会报错
java.lang.NullPointerException 空指针异常

int [][] arr = new int[3][]; // 一维数组没有初始化
System.out.println(arr[0][1]);

-----------------控制台输出--------------------
Exception in thread "main" java.lang.NullPointerException // 空指针异常
	at review.ErrorTest.main(ErrorTest.java:21)

由于一维数组arr[0]的变量没有指向任何数组对象,这个时候对该数组名进行 . 和 [ ] 的访问就会报空指针异常错误。

需要继续将一维数组初始化后才能进行取值,而且由于一维数组分别进行初始化,所以他们的长度可以不一样

数组名[下标] = new 数据类型[数据长度];
arr[0] = new int[4];
arr[1] = new int[3];
arr[2] = new int[2];
System.out.println(arr[0][1]);

当然此时控制台还是输出0,因为数组里的元素还没有赋值,默认为0

(3)静态初始化

// 数据类型 [][]数组名 = new 数据类型[][]{{v1,v2,...},{v3,v4,..},{v5,...}...};
int [][] arr = new int[][]{{v1,v2,...},{v3,v4,..},{v5,...}...};

与一维数组的静态初始化类似,直接给出了二维数组中的所有一维数组的所有内容

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值