初识java中数组数组在内存中越界异常空指针异常

Posted 苦海123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识java中数组数组在内存中越界异常空指针异常相关的知识,希望对你有一定的参考价值。

数组:

当存储多个数据时,此时可能会使用多个变量,这样不断声明变量会很麻烦,而这些变量都有相似的特性,因此我们可以将它们存放到一个容器中,统一处理。

容器:是将多个数据存储到一起,每个数据称为该容器的元素。

数组概念: 数组是存储数据的容器,多个数据的数据类型一致。

数组特性:数组是一种引用类型数据、数组中多个数据的类型一致、数组的长度在程序运行期间不可改变、

数组初始化:在内存中创建一个数组,并向其中赋些默认的值;初始化数组的方式有两种:动态初始化(指定数组长度)、静态初始化(不指定数组长度,自动推算长度,直接指定内容)。

public class Arrays {
    public static void main(String[] args){
    // 1.动态初始化数组的格式:数据类型[] 数组名 = new 数据类型[数组长度];
    // 左侧数据类型:数组当中保存的数据的类型,且数据类型一致。
    // 左侧中括号:代表一个数组
    // 左侧数组名:给初始化的这个数组一个变量名。
    // 右侧的关键字new:表示创建的动作。
    // 右侧数据类型:和左侧数据类型保持一致
    // 右侧中括号中数组长度:一个整数型数字,表示数组中元素的个数。
        int[] arrInt = new int[5];//创建了一个数据类型为int数组长度为5的数组arr
        String[] arrString = new String[10];//创建了一个数据类型为String数组长度为10的数组arrString

    // 2.静态初始化数组的格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};其简写格式:数据类型[] 数组名 = {元素1,元素2,...};
        int[] arrnum = new int[]{1,2,3,4,5};//创建了一个数组元素为:1,2,3,4,5的数组arrnum,其数组长度为5
        String[] arrHello = {"hello","world","my","name","is","kuhai"};//使用数组的简写格式定义一个数组arrHello,简写方式不支持将数组拆分后再赋值给变量的形式定义数组,如:int arr;arr = {1,2},编译器无法解析;
        System.out.println(arrHello);//[Ljava.lang.String;@6d1e7682,直接打印数组会的到一个内存地址哈希值。
        // int arr = {1,3,4},Arrays.java:17: 错误: 需要';'int arr = {1,3,4}

    // 3.访问数组中的元素:直接答应数组会得到一个内存地址哈希值,想要访问到数组中的具体元素,其方法是:数组名[索引],索引为整型从0开始到数组长度-1,0表示数组的第一个元素,后面的因此类推,如:
        int[] arraynum =new int[]{1,2,3,4};
        System.out.println(arraynum[0]);//1
        System.out.println(arraynum[arraynum.length-1]);//4,arraynum.length表示数组的长度,length表示长度,通过点.访问数组的这个属性。
    
    // 4.动态初始化的数组默认每一项都有相同的值(int类型默认值为:0、浮点型默认为:0.0、字符型默认为:'/u0000'、布尔型默认为:false、引用型默认为:null),如:
        int[] arrayone = new int[2];
        System.out.println(arrayone[0]);//0
        System.out.println(arrayone[1]);//0
        // 给动态初始化的数组元素赋值后,可以修改默认值,其格式为:数组名[索引]=值,如:
        arrayone[0] = 2;
        arrayone[1] = 5;
        System.out.println(arrayone[0]);//2,赋值后,默认值被修改了
        System.out.println(arrayone[1]);//5
    }
}

Java虚拟机的内存划分:

为了提高运算效率,对空间进行不同区域的划分,每一片区域都有特定的处理数据方式和内存管理方式。

JVM的内存划分:


数组存储在内存中:

两个数组在内存中

public static void main(String[] args) {
	int[] arr = new int[3];
	int[] arr2 = new int[2];
	System.out.println(arr);
	System.out.println(arr2);
}

两变量指向同一地址

public static void main(String[] args) {
	// 定义数组,存储3个元素
	int[] arr = new int[3];
	//数组索引进行赋值
	arr[0] = 5;
	arr[1] = 6;
	arr[2] = 7;
	//输出3个索引上的元素值
	System.out.println(arr[0]);
	System.out.println(arr[1]);
	System.out.println(arr[2]);
	//定义数组变量arr2,将arr的地址赋值给arr2
	int[] arr2 = arr;
	arr2[1] = 9;
	System.out.println(arr[1]);
}


遍历数组及越界异常、空指针异常

public class Arraytest {
    public static void main(String[] args){
        // 1.两个变量指向同一地址:当两个变量指向同一地址时,这两个变量都可以修改内存中的数据,如:
        int[] arr1 = new int[]{1,2};
        int[] arr2 = arr1;
        System.out.println(arr2[1]);//2
        arr2[1] = 5;
        System.out.println(arr1[1]);//5
        arr1[0] = 3;
        System.out.println(arr2[0]);//3


        // 2.遍历数组:
        for(int i = 0; i < arr1.length; i++){
            System.out.println("arr1中第" + (i+1) + "个元素为:" + arr1[i]);
        }
        
        // 3.数组越界访问异常:访问一个数组中超出数组长度-1的索引的元素时会报:ArrayIndexOutOfBoundsException,表示数组索引越界异常,异常后面的代码将不再执行
        System.out.println(arr1[2]);//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 at Arraytest.main(Arraytest.java:13)

        // 4.数组空指针异常:当给一个数组变量没有初始化,而是给null值,null表示什么也没有,此时会发生空指针异常,异常后面的代码将不再执行
        int[] arr3 = null;
        System.out.println(arr3[2]);//Exception in thread "main" java.lang.NullPointerException at Arraytest.main(Arraytest.java:17)
        System.out.println("arr3[2]");//Exception in thread "main" java.lang.NullPointerException at Arraytest.main(Arraytest.java:17)
    }
}

提示:本文图片等素材来源于网络,若有侵权,请发邮件至邮箱:810665436@qq.com联系笔者删除。
笔者:苦海

以上是关于初识java中数组数组在内存中越界异常空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

初识异常

数组中常见的异常

在android中,数据下标越界,则发生啥异常

Java基础5---数组

数组操作的两个常见小问题越界和空指针

2019-05-18 java学习日记