前言:
空指针异常,可以说是伴随程序员终身的一个异常。在处理空指针异常的同时,我们必须了解为什么会发生空指针异常,也就是:发生空指针异常的时候,内存结构发生了什么变化。接下来的三个例子,是关于数组发生空指针的时候,内存结构的变化。
正文:
在下面的代码中,我们new一个长度为3的boolean数组对象的时候,栈中的变量a指向堆中的数组对象,这个时候程序是正常的:
boolean[] a = new boolean[3];
System.out.println(a[0]);
空指针异常:
①、如果我们把上面的a变量置成null,内存结构是怎么变化的呢?
boolean[] a = new boolean[3];
a = null;
System.out.println(a[0]);
这个时候,栈空间的地址值为null,也就是说指针为空,无法指向堆空间的区域,所以抛空指针异常(NullPointerException):
②、或者说,不把变量a设为null,而是new出一个对象就直接去调用方法,在内存中是什么样的情况呢?
String[] a = new String[3];
System.out.println(a[0].toString());
由于新创建的对象值为null,去调用toString()方法的时候,一样没有这个指针存在,同样报空指针异常:
③、其实下面的二维数组空指针异常的原理和②相似,二维数组直接赋值抛空指针:
int[][] a = new int[3][4];
a[2][0] = 12;
二维数组第三行为null的情况下,怎么知道去指向哪一个的第一个元素(假设需要取地址为0x6677的第一个元素):
结束语:
原理很重要,只知其一,不知其原理,让博主在做项目的过程中吃过不少苦头。以后的学习,博主需要更加注重知识点背后的原理。