第三讲-内存结构之空指针

前言:

        空指针异常,可以说是伴随程序员终身的一个异常。在处理空指针异常的同时,我们必须了解为什么会发生空指针异常,也就是:发生空指针异常的时候,内存结构发生了什么变化。接下来的三个例子,是关于数组发生空指针的时候,内存结构的变化。

 

正文:

         在下面的代码中,我们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的第一个元素):

 

结束语:

        原理很重要,只知其一,不知其原理,让博主在做项目的过程中吃过不少苦头。以后的学习,博主需要更加注重知识点背后的原理。

转载于:https://my.oschina.net/linxxbaobao/blog/1545741

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值